ZGlmZiAtLWdpdCBhL2Fib3V0Lmh0bWwgYi9hYm91dC5odG1sCmluZGV4IDY0YzA1OTguLmU4YjgzNGQgMTAwNjQ0Ci0tLSBhL2Fib3V0Lmh0bWwKKysrIGIvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMyBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDEsIDIwMTY8L3A+CQorPHA+Tm92ZW1iZXIgMzAsIDIwMTc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL25vdGljZS5odG1sIGIvbm90aWNlLmh0bWwKaW5kZXggYzNkMzRjMy4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvbm90aWNlLmh0bWwKKysrIGIvbm90aWNlLmh0bWwKQEAgLTcsMTAxICs3LDE4MyBAQAogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmZlYXR1cmUvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmZlYXR1cmUvTElDRU5TRS50eHQKaW5kZXggZmY0MmFkNC4uZmM1OTM4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL0xJQ0VOU0UudHh0CisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9MSUNFTlNFLnR4dApAQCAtMSwxNjEgKzEsMTQwIEBACi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50CiAKLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgotT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCitOb3ZlbWJlciAyMiwgMjAxNwogCi0xLiBERUZJTklUSU9OUworVXNhZ2UgT2YgQ29udGVudAogCi0iQ29udHJpYnV0aW9uIiBtZWFuczoKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULgogCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCitBcHBsaWNhYmxlIExpY2Vuc2VzCiAKLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LgogCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS4KIAotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZQorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heQorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLgorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy4KIAotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi1BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKLWFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAotZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcworYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOgogCi0iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5CistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucworLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXMKIAotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZwordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZQorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3UKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdQord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2gKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS4KIAotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOgogCi0iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCkKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCkKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCkKIAotMi4gR1JBTlQgT0YgUklHSFRTCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuCiAKLWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCi1hbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLgorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CiAKLWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQotY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCi1hZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKLWFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLgogCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KLWFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKLWJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZQorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0CithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZQorZm9sbG93aW5nOgogCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bwotZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heQorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LgorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLgorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2gKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZQorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4KIAotMy4gUkVRVUlSRU1FTlRTCitDcnlwdG9ncmFwaHkKIAotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseQorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcworcGVybWl0dGVkLgogCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKLXdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKLW90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAotaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAotdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwotdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgotb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCi1icm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5Ci0gcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKLXRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCi1yZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KLVVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCi10aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCi10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi1DT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAotTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCi1kZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQotd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKLURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCi1IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotNy4gR0VORVJBTAotCi1JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKLXByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAotUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCi1saXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAotbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KLW9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcwotIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKLWlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCi1uZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQotcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKLWRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCi1uZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcwotb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCi1vZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggYjg5MjBmZi4uZDZiMWIwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTEsMiArMSwyIEBACi1iaW4uaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsICBlcGwtdjEwLmh0bWwsICBmZWF0dXJlLnhtbCxcCitiaW4uaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsICBlcGwtMi4wLmh0bWwsICBmZWF0dXJlLnhtbCxcCiAgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9lcGwtMi4wLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmZlYXR1cmUvZXBsLTIuMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2ExODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmZlYXR1cmUvZXBsLTIuMC5odG1sCkBAIC0wLDAgKzEsMzAwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIDx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAyLjA8L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsKKyAgICAgICAgbWFyZ2luOiAxLjVlbSAzZW07CisgICAgICB9CisgICAgICBoMXsKKyAgICAgICAgZm9udC1zaXplOjEuNWVtOworICAgICAgfQorICAgICAgaDJ7CisgICAgICAgIGZvbnQtc2l6ZToxZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206MC41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MWVtOworICAgICAgfQorICAgICAgcCB7CisgICAgICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgICB9CisgICAgICB1bCwgb2x7CisgICAgICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDIuMDwvaDE+CisgICAgPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICAgIFBVQkxJQyBMSUNFTlNFICgmbGRxdW87QUdSRUVNRU5UJnJkcXVvOykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICAgIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCYjMDM5O1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkZWZpbml0aW9ucyI+MS4gREVGSU5JVElPTlM8L2gyPgorICAgIDxwPiZsZHF1bztDb250cmlidXRpb24mcmRxdW87IG1lYW5zOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvbnRlbnQKKyAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgICAgICAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICAgICAgICZsZHF1bztvcmlnaW5hdGVzJnJkcXVvOyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvciYjMDM5O3MgYmVoYWxmLgorICAgICAgICBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGNoYW5nZXMgb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHRoYXQKKyAgICAgICAgYXJlIG5vdCBNb2RpZmllZCBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0b3ImcmRxdW87IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9wPgorICAgIDxwPiZsZHF1bztMaWNlbnNlZCBQYXRlbnRzJnJkcXVvOyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCisgICAgICBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCisgICAgICBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztQcm9ncmFtJnJkcXVvOyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBEaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworICAgICAgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UmVjaXBpZW50JnJkcXVvOyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICBvciBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UgKGFzIGFwcGxpY2FibGUpLCBpbmNsdWRpbmcgQ29udHJpYnV0b3JzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGVyaXZhdGl2ZSBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgUHJvZ3JhbSBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztNb2RpZmllZCBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yayBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtIHRoYXQKKyAgICAgIHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZQorICAgICAgY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCisgICAgICBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgY29udGFpbnMgYW55IGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLiBNb2RpZmllZAorICAgICAgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCBjb250YWluIG9ubHkgZGVjbGFyYXRpb25zLCBpbnRlcmZhY2VzLAorICAgICAgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseSBpbiBlYWNoIGNhc2UKKyAgICAgIGluIG9yZGVyIHRvIGxpbmsgdG8sIGJpbmQgYnkgbmFtZSwgb3Igc3ViY2xhc3MgdGhlIFByb2dyYW0gb3IgTW9kaWZpZWQKKyAgICAgIFdvcmtzIHRoZXJlb2YuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEaXN0cmlidXRlJnJkcXVvOyBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQorICAgICAgaW4gYW55IG1hbm5lciB0aGF0IGVuYWJsZXMgdGhlIHRyYW5zZmVyIG9mIGEgY29weS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NvdXJjZSBDb2RlJnJkcXVvOyBtZWFucyB0aGUgZm9ybSBvZiBhIFByb2dyYW0gcHJlZmVycmVkIGZvciBtYWtpbmcKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCisgICAgICBkb2N1bWVudGF0aW9uIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTZWNvbmRhcnkgTGljZW5zZSZyZHF1bzsgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICAgIFZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CisgICAgICBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXMgaWRlbnRpZmllZCBieSB0aGUgaW5pdGlhbAorICAgICAgQ29udHJpYnV0b3IuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ3JhbnQtb2YtcmlnaHRzIj4yLiBHUkFOVCBPRiBSSUdIVFM8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAorICAgICAgICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgICBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICAgICAgICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICAgICAgICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgICAgICAgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICAgICAgICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsCisgICAgICAgIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCisgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorICAgICAgICBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkKKyAgICAgICAgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyCisgICAgICAgIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCisgICAgICAgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgICAgICAgIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorICAgICAgICBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LgorICAgICAgICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgICAgICAgIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCisgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cworICAgICAgICBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwKKyAgICAgICAgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0bworICAgICAgICBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50JiMwMzk7cworICAgICAgICByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50CisgICAgICAgIGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorICAgICAgPC9saT4KKyAgICAgIDxsaT5lKSBOb3R3aXRoc3RhbmRpbmcgdGhlIHRlcm1zIG9mIGFueSBTZWNvbmRhcnkgTGljZW5zZSwgbm8gQ29udHJpYnV0b3IKKyAgICAgICAgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbiB0aG9zZSBzZXQgZm9ydGgKKyAgICAgICAgaW4gdGhpcyBBZ3JlZW1lbnQpIGFzIGEgcmVzdWx0IG9mIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByZWNlaXB0IG9mIHRoZQorICAgICAgICBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlIChpZiBwZXJtaXR0ZWQgdW5kZXIKKyAgICAgICAgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMykuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPjMuIFJFUVVJUkVNRU5UUzwvaDI+CisgICAgPHA+My4xIElmIGEgQ29udHJpYnV0b3IgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0gaW4gYW55IGZvcm0sIHRoZW46PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSB0aGUgUHJvZ3JhbSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMgU291cmNlIENvZGUsIGluCisgICAgICAgIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDMuMiwgYW5kIHRoZSBDb250cmlidXRvciBtdXN0IGFjY29tcGFueQorICAgICAgICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICAgICAgICBpcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZCBpbmZvcm1zIFJlY2lwaWVudHMgaG93IHRvCisgICAgICAgIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICAgICAgICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsCisgICAgICAgICAgICBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paWkpIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMmIzAzOTsgcmlnaHRzIGluIHRoZQorICAgICAgICAgICAgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPml2KSByZXF1aXJlcyBhbnkgc3Vic2VxdWVudCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYW55IHBhcnR5CisgICAgICAgICAgICB0byBiZSB1bmRlciBhIGxpY2Vuc2UgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIHNlY3Rpb24gMy4KKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgb3IgaWYgdGhlIFByb2dyYW0gKGkpCisgICAgICAgIGlzIGNvbWJpbmVkIHdpdGggb3RoZXIgbWF0ZXJpYWwgaW4gYSBzZXBhcmF0ZSBmaWxlIG9yIGZpbGVzIG1hZGUgYXZhaWxhYmxlCisgICAgICAgIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGF0dGFjaGVkIHRvCisgICAgICAgIHRoZSBTb3VyY2UgQ29kZSB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiBFeGhpYml0IEEgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICAgIHRoZW4gdGhlIFByb2dyYW0gbWF5IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoCisgICAgICAgIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLAorICAgICAgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eQorICAgICAgKCZsc3F1bztub3RpY2VzJnJzcXVvOykgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mIHRoZSBQcm9ncmFtIHdoaWNoCisgICAgICB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQgdGhlaXIgb3duIGFwcHJvcHJpYXRlCisgICAgICBub3RpY2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImNvbW1lcmNpYWwtZGlzdHJpYnV0aW9uIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvaDI+CisgICAgPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKKyAgICAgIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcworICAgICAgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCisgICAgICBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkCisgICAgICBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIKKyAgICAgIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEKKyAgICAgIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJmxkcXVvO0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcmRxdW87KQorICAgICAgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgorICAgICAgKCZsZHF1bztJbmRlbW5pZmllZCBDb250cmlidXRvciZyZHF1bzspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKKyAgICAgIChjb2xsZWN0aXZlbHkgJmxkcXVvO0xvc3NlcyZyZHF1bzspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCisgICAgICBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudAorICAgICAgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbgorICAgICAgd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLgorICAgICAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcKKyAgICAgIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0bworICAgICAgcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorICAgICAgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLAorICAgICAgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQKKyAgICAgIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisgICAgPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0KKyAgICAgIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorICAgICAgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zCisgICAgICBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJiMwMzk7cyByZXNwb25zaWJpbGl0eSBhbG9uZS4KKyAgICAgIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zCisgICAgICBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCisgICAgICB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzCisgICAgICBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJ3YXJyYW50eSI+NS4gTk8gV0FSUkFOVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmbGRxdW87QVMgSVMmcmRxdW87IEJBU0lTLCBXSVRIT1VUCisgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorICAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlCisgICAgICByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZQorICAgICAgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgorICAgICAgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGlzY2xhaW1lciI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWQorICAgICAgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCisgICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAgICAgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCisgICAgICBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ2VuZXJhbCI+Ny4gR0VORVJBTDwvaDI+CisgICAgPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKKyAgICAgIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUKKyAgICAgIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZQorICAgICAgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudAorICAgICAgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorICAgIDwvcD4KKyAgICA8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgorICAgICAgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKKyAgICAgIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByaWdodHMgZ3JhbnRlZAorICAgICAgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgICAgPC9wPgorICAgIDxwPkFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KKyAgICAgIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQKKyAgICAgIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZworICAgICAgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQorICAgICAgYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQmIzAzOTtzIG9ibGlnYXRpb25zIHVuZGVyCisgICAgICB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZQorICAgICAgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKyAgICA8L3A+CisgICAgPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5CisgICAgICBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMKKyAgICAgIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodAorICAgICAgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudAorICAgICAgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcworICAgICAgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mCisgICAgICB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyAgICAgIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uCisgICAgICBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3CisgICAgICB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZQorICAgICAgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorICAgIDwvcD4KKyAgICA8cD5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKKyAgICAgIHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorICAgICAgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKKyAgICAgIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKKyAgICAgIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAorICAgICAgdG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KKyAgICAgIE5vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJleGhpYml0LWEiPkV4aGliaXQgQSAmbmRhc2g7IEZvcm0gb2YgU2Vjb25kYXJ5IExpY2Vuc2VzIE5vdGljZTwvaDI+CisgICAgPHA+JmxkcXVvO1RoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyAKKyAgICAJU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCAKKyAgICAJaW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAorICAgIAl2ZXJzaW9uKHMpLCBhbmQgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGhlcmV9LiZyZHF1bzsKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5TaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgICAgICAgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIHVuZGVyIFNlY29uZGFyeSBMaWNlbnNlcy4KKyAgICAgIDwvcD4KKyAgICAgIDxwPklmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIGZpbGUsCisgICAgICAgIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UgZmlsZSBpbiBhCisgICAgICAgIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yCisgICAgICAgIHN1Y2ggYSBub3RpY2UuCisgICAgICA8L3A+CisgICAgICA8cD5Zb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC48L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOThhY2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi08IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgYm9keSB7Ci0gICAgc2l6ZTogOC41aW4gMTEuMGluOwotICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKLSAgICB0YWItaW50ZXJ2YWw6IDAuNWluOwotICAgIH0KLSAgcCB7ICAJCi0gICAgbWFyZ2luLWxlZnQ6IGF1dG87Ci0gICAgbWFyZ2luLXRvcDogIDAuNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwotICAgIH0KLSAgcC5saXN0IHsKLSAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKLSAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKLSAgICB9Ci0gIDwvc3R5bGU+Ci0KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotCi08aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKLVBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUwotQUdSRUVNRU5ULjwvcD4KLQotPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgotCi08cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKLWNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgotPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KLTxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQotb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKLUNvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKLVByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCi1Db250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KLWNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQotYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCi10aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKLUNvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQotd2l0aCB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKLW9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKLW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50Ci1saWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAotc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKLWJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgotZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCi1hcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCi1wYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCi1Db250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Ci1hbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1vciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKLWdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgotZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKLXRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKLWhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAotdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCi1mb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKLW9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLWNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKLUFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCi1wYXJ0eTsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKLWZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQotcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQotZXhjaGFuZ2UuPC9wPgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCi1jb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKLXdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCi1saWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKLXRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCi1wb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAotaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQotYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCi1wYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKLWFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCi1vcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQotSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KLWV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+Ci0KLTxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUwotT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKLU9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi10aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAotZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKLWludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKLU5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+Ci0KLTxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCi10aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KLWJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KLWV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQotUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgotc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQotZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAotZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCi1hZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKLXVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKLXJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQotQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQotc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQotZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKLWV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCi1yaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKLXRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKLUFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKLXRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQotdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKLXJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KLQotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggMDI2NDVlNS4uYzA1YTcwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xLDkgKzEsMTEgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogIwogIyBDb250cmlidXRvcnM6CiAjICAgICBDcmlzdGlhbm8gR2F2aeNvIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCkBAIC0zMCw5ICszMiwxMSBAQAogY29weXJpZ2h0PVwKIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIFxuXAogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCBcblwKIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAoraHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cblwKK1xuXAorU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcblwKIFxuXAogIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCkBAIC00NCwxMjYgKzQ4LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotRmVicnVhcnkgMSwgMjAxMVxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KICMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggNmU1NzlhNS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDE2NCArMSwxODkgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQotIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KLSBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKLXNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCi1hdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIAotZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIAotbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmIzg0ODI7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIAotRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIAotc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgCi1uYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyAKLW9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCAKLUZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSAKLWxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55Ci0gZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCi1pbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKLSBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAotRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAotZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKLWZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiAKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLgotICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKLUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCi1vciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCAKLWV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiAKLWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgCi1jYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCAKLXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAotIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCi0gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAotdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKLWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAotd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAotZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAotIGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKLXVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKLVVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi13aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKLSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAotYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCi1zb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKLXRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL3BvbS54bWwKaW5kZXggMWFhNDViMi4uN2Q4MTFiOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5mZWF0dXJlL3BvbS54bWwKQEAgLTIsOSArMiwxMSBAQAogPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIDwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpLiAtLT4KIDwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Ci08IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgLS0+CiA8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KLTwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgLS0+Cis8IS0tIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgIC0tPgogPCEtLSMgLS0+CiA8IS0tIyBDb250cmlidXRvcnM6IC0tPgogPCEtLSMgQ2hyaXN0b3BoZSBMb2V0eiAgKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3BvbS54bWwKaW5kZXggMzFiZGVkNC4uMTIyMzEyMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9wb20ueG1sCkBAIC0yLDkgKzIsMTEgQEAKIDwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KIDwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Ci08IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgLS0+CiA8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KLTwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgLS0+Cis8IS0tIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgIC0tPgogPCEtLSMgLS0+CiA8IS0tIyBDb250cmlidXRvcnM6IC0tPgogPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9BYnN0cmFjdFN0cmF0ZWd5RFNMSWRlTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL0Fic3RyYWN0U3RyYXRlZ3lEU0xJZGVNb2R1bGUuamF2YQppbmRleCAxNjI0OTUzLi4wNmJhY2M4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL0Fic3RyYWN0U3RyYXRlZ3lEU0xJZGVNb2R1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL0Fic3RyYWN0U3RyYXRlZ3lEU0xJZGVNb2R1bGUuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxTdHJhdGVneURTTENvbnRlbnRBc3Npc3RQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9QYXJ0aWFsU3RyYXRlZ3lEU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEKaW5kZXggZTg3MTAyNC4uOGQ3MjIzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxTdHJhdGVneURTTENvbnRlbnRBc3Npc3RQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvUGFydGlhbFN0cmF0ZWd5RFNMQ29udGVudEFzc2lzdFBhcnNlci5qYXZhCkBAIC0xLDUgKzEsMTcgQEAKLS8qCi0gKiBnZW5lcmF0ZWQgYnkgWHRleHQgMi4xMS4wCisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlLmNvbnRlbnRhc3Npc3QuYW50bHI7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9TdHJhdGVneURTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1N0cmF0ZWd5RFNMUGFyc2VyLmphdmEKaW5kZXggOThkNmE0YS4uYTZmYzZjNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1N0cmF0ZWd5RFNMUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL1N0cmF0ZWd5RFNMUGFyc2VyLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUuY29udGVudGFzc2lzdC5hbnRscjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMLmcKaW5kZXggMGQ5ZmMwMi4uMzYxZDhhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0wuZworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTC5nCkBAIC0zNTIwLDIxICszNTIwLDI3IEBACiAJKQogCXwKIAkoCi0JCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKwkJKCdGb3JtJykKKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRGT1JNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisJKQorCXwKKwkoCisJCXsgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CiAJCSgnRm9ybTInKQotCQl7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CisJCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KIAkpCiAJfAogCSgKLQkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IH0KIAkJKCdGb3JtMycpCi0JCXsgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRGT1JNM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQogCSkKIAl8CiAJKAotCQl7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IH0KKwkJeyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Q1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkpOyB9CiAJCSgnQ3NzJykKLQkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IH0KKwkJeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IH0KIAkpCiA7CiBmaW5hbGx5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMLnRva2VucyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMLnRva2VucwppbmRleCBkNWNjOGE2Li40NTUwMzA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTC50b2tlbnMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0wudG9rZW5zCkBAIC0xLDIwICsxLDIwIEBACiAnISc9NDAKICchPSc9MjIKICchPT0nPTI0Ci0nIyc9ODIKKycjJz04MwogJyUnPTM5CiAnJT0nPTIwCiAnJiYnPTE1Ci0nJic9MTA0Ci0nKCc9NzgKLScpJz03OQorJyYnPTEwNQorJygnPTc5CisnKSc9ODAKICcqJz0zNgogJyoqJz0zNwogJyo9Jz0xOAogJysnPTM0CiAnKysnPTQxCiAnKz0nPTE2Ci0nLCc9ODAKKycsJz04MQogJy0nPTM1CiAnLS0nPTQyCiAnLT0nPTE3CkBAIC0yNCw5ICsyNCw5IEBACiAnLi48Jz0yOQogJy8nPTM4CiAnLz0nPTE5Ci0nOic9ODkKLSc6Oic9MTA2Ci0nOyc9NzYKKyc6Jz05MAorJzo6Jz0xMDcKKyc7Jz03NwogJzwnPTI3CiAnPD4nPTMyCiAnPSc9MTMKQEAgLTM1LDY3ICszNSw2OCBAQAogJz0+Jz0zMQogJz4nPTI2CiAnPj0nPTI1Ci0nPyc9MTAzCi0nPy4nPTEwNworJz8nPTEwNAorJz8uJz0xMDgKICc/Oic9MzMKLSdAJz03NwotJ0JhY2t3YXJkJz01OAotJ0Nzcyc9NTYKLSdGb3JtMic9NTQKLSdGb3JtMyc9NTUKLSdGb3J3YXJkJz01NworJ0AnPTc4CisnQmFja3dhcmQnPTU5CisnQ3NzJz01NworJ0Zvcm0nPTU0CisnRm9ybTInPTU1CisnRm9ybTMnPTU2CisnRm9yd2FyZCc9NTgKICdHcmlkJz01MwogJ0hvcml6b250YWwnPTUxCiAnVmVydGljYWwnPTUyCi0nWyc9ODMKLSddJz04MQotJ2FzJz04NQotJ2Nhc2UnPTkwCi0nY2F0Y2gnPTEwMgotJ2RlZmF1bHQnPTczCi0nZGVmYXVsdEZvY3VzaW5nPSc9NzUKLSdkZWZhdWx0TGF5b3V0aW5nPSc9NzQKLSdkbyc9OTMKLSdlY3ZpZXdGb2N1c2luZ0lkPSc9NjcKLSdlbHNlJz04NworJ1snPTg0CisnXSc9ODIKKydhcyc9ODYKKydjYXNlJz05MQorJ2NhdGNoJz0xMDMKKydkZWZhdWx0Jz03NAorJ2RlZmF1bHRGb2N1c2luZz0nPTc2CisnZGVmYXVsdExheW91dGluZz0nPTc1CisnZG8nPTk0CisnZWN2aWV3Rm9jdXNpbmdJZD0nPTY4CisnZWxzZSc9ODgKICdleHRlbmRzJz00NQogJ2V4dGVuc2lvbic9NDgKICdmYWxzZSc9NTAKLSdmaW5hbGx5Jz0xMDAKLSdmb2N1cz0nPTY4Ci0nZm9jdXNpbmdFbmhhbmNlcic9NzIKLSdmb2N1c2luZ1N0cmF0ZWd5Jz02NgotJ2Zvcic9OTEKLSdpZic9ODYKKydmaW5hbGx5Jz0xMDEKKydmb2N1cz0nPTY5CisnZm9jdXNpbmdFbmhhbmNlcic9NzMKKydmb2N1c2luZ1N0cmF0ZWd5Jz02NworJ2Zvcic9OTIKKydpZic9ODcKICdpbXBvcnQnPTQ3Ci0naW5zdGFuY2VvZic9ODQKLSdrZXlDb2RlPSc9NzAKLSdrZXlTdHJva2VEZWZpbml0aW9uJz02OQotJ2xheW91dD0nPTY1Ci0nbGF5b3V0aW5nU3RyYXRlZ3knPTY0Ci0nbW9kaWZpZXJLZXlzJz03MQotJ25ldyc9OTQKLSducyc9MTA1Ci0nbnVsbCc9OTUKLSdwYWNrYWdlJz01OQotJ3JldHVybic9OTgKKydpbnN0YW5jZW9mJz04NQorJ2tleUNvZGU9Jz03MQorJ2tleVN0cm9rZURlZmluaXRpb24nPTcwCisnbGF5b3V0PSc9NjYKKydsYXlvdXRpbmdTdHJhdGVneSc9NjUKKydtb2RpZmllcktleXMnPTcyCisnbmV3Jz05NQorJ25zJz0xMDYKKydudWxsJz05NgorJ3BhY2thZ2UnPTYwCisncmV0dXJuJz05OQogJ3N0YXRpYyc9NDYKLSdzdHJhdGVneSc9NjIKKydzdHJhdGVneSc9NjMKICdzdXBlcic9NDkKLSdzd2l0Y2gnPTg4Ci0nc3luY2hyb25pemVkJz0xMDEKLSd0YXJnZXRzJz02MwotJ3Rocm93Jz05NwotJ3RydWUnPTExMAotJ3RyeSc9OTkKLSd0eXBlb2YnPTk2Cisnc3dpdGNoJz04OQorJ3N5bmNocm9uaXplZCc9MTAyCisndGFyZ2V0cyc9NjQKKyd0aHJvdyc9OTgKKyd0cnVlJz0xMTEKKyd0cnknPTEwMAorJ3R5cGVvZic9OTcKICd2YWwnPTQ0Ci0ndmFyJz0xMDkKLSd3aGlsZSc9OTIKLSd7Jz02MAotJ3wnPTEwOAorJ3Zhcic9MTEwCisnd2hpbGUnPTkzCisneyc9NjEKKyd8Jz0xMDkKICd8fCc9MTQKLSd9Jz02MQorJ30nPTYyCiBSVUxFX0FOWV9PVEhFUj0xMgogUlVMRV9ERUNJTUFMPTcKIFJVTEVfSEVYPTUKQEAgLTExNiw2ICsxMTcsNyBAQAogVF9fMTA4PTEwOAogVF9fMTA5PTEwOQogVF9fMTEwPTExMAorVF9fMTExPTExMQogVF9fMTM9MTMKIFRfXzE0PTE0CiBUX18xNT0xNQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0xMZXhlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0xMZXhlci5qYXZhCmluZGV4IDY1NDYzNTAuLmE0NWI2NjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMTGV4ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTExleGVyLmphdmEKQEAgLTEsMyArMSwxOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOwogCiAvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCkBAIC0xMDEsNiArMTE2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MD04MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTE9MTExOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CkBAIC05OTAsMTAgKzEwMDYsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyOjc6ICggJ0Zvcm0yJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI6OTogJ0Zvcm0yJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyOjc6ICggJ0Zvcm0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mjo5OiAnRm9ybScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJGb3JtMiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJGb3JtIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwMTEsMTAgKzEwMjcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOjc6ICggJ0Zvcm0zJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM6OTogJ0Zvcm0zJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOjc6ICggJ0Zvcm0yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM6OTogJ0Zvcm0yJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIkZvcm0zIik7IAorICAgICAgICAgICAgbWF0Y2goIkZvcm0yIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwMzIsMTAgKzEwNDgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0Ojc6ICggJ0NzcycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0Ojk6ICdDc3MnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ6NzogKCAnRm9ybTMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDo5OiAnRm9ybTMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiQ3NzIik7IAorICAgICAgICAgICAgbWF0Y2goIkZvcm0zIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwNTMsMTAgKzEwNjksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1Ojc6ICggJ0ZvcndhcmQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTo5OiAnRm9yd2FyZCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTo3OiAoICdDc3MnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTo5OiAnQ3NzJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIkZvcndhcmQiKTsgCisgICAgICAgICAgICBtYXRjaCgiQ3NzIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwNzQsMTAgKzEwOTAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2Ojc6ICggJ0JhY2t3YXJkJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY6OTogJ0JhY2t3YXJkJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2Ojc6ICggJ0ZvcndhcmQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Njo5OiAnRm9yd2FyZCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJCYWNrd2FyZCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJGb3J3YXJkIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTEwOTUsMTAgKzExMTEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Ojc6ICggJ3BhY2thZ2UnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Nzo5OiAncGFja2FnZScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Nzo3OiAoICdCYWNrd2FyZCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Ojk6ICdCYWNrd2FyZCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJwYWNrYWdlIik7IAorICAgICAgICAgICAgbWF0Y2goIkJhY2t3YXJkIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTExMTYsMTAgKzExMzIsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4Ojc6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODo5OiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODo3OiAoICdwYWNrYWdlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg6OTogJ3BhY2thZ2UnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgneycpOyAKKyAgICAgICAgICAgIG1hdGNoKCJwYWNrYWdlIik7IAorCiAKICAgICAgICAgICAgIH0KIApAQCAtMTEzNiwxMCArMTE1MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjE7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk6NzogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5Ojk6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5Ojc6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTo5OiAneycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCd9Jyk7IAorICAgICAgICAgICAgbWF0Y2goJ3snKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMTE1NiwxMSArMTE3MywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjI7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA6NzogKCAnc3RyYXRlZ3knICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDo5OiAnc3RyYXRlZ3knCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA6NzogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwOjk6ICd9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInN0cmF0ZWd5Iik7IAotCisgICAgICAgICAgICBtYXRjaCgnfScpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0xMTc3LDEwICsxMTkzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTo3OiAoICd0YXJnZXRzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE6OTogJ3RhcmdldHMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE6NzogKCAnc3RyYXRlZ3knICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTo5OiAnc3RyYXRlZ3knCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidGFyZ2V0cyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJzdHJhdGVneSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMTk4LDEwICsxMjE0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjo3OiAoICdsYXlvdXRpbmdTdHJhdGVneScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyOjk6ICdsYXlvdXRpbmdTdHJhdGVneScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjo3OiAoICd0YXJnZXRzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI6OTogJ3RhcmdldHMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibGF5b3V0aW5nU3RyYXRlZ3kiKTsgCisgICAgICAgICAgICBtYXRjaCgidGFyZ2V0cyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMjE5LDEwICsxMjM1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzo3OiAoICdsYXlvdXQ9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM6OTogJ2xheW91dD0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM6NzogKCAnbGF5b3V0aW5nU3RyYXRlZ3knICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzo5OiAnbGF5b3V0aW5nU3RyYXRlZ3knCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibGF5b3V0PSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJsYXlvdXRpbmdTdHJhdGVneSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMjQwLDEwICsxMjU2LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDo3OiAoICdmb2N1c2luZ1N0cmF0ZWd5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ6OTogJ2ZvY3VzaW5nU3RyYXRlZ3knCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ6NzogKCAnbGF5b3V0PScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0Ojk6ICdsYXlvdXQ9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZvY3VzaW5nU3RyYXRlZ3kiKTsgCisgICAgICAgICAgICBtYXRjaCgibGF5b3V0PSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMjYxLDEwICsxMjc3LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTo3OiAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1Ojk6ICdlY3ZpZXdGb2N1c2luZ0lkPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTo3OiAoICdmb2N1c2luZ1N0cmF0ZWd5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU6OTogJ2ZvY3VzaW5nU3RyYXRlZ3knCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZWN2aWV3Rm9jdXNpbmdJZD0iKTsgCisgICAgICAgICAgICBtYXRjaCgiZm9jdXNpbmdTdHJhdGVneSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMjgyLDEwICsxMjk4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182ODsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Njo3OiAoICdmb2N1cz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Njo5OiAnZm9jdXM9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2Ojc6ICggJ2Vjdmlld0ZvY3VzaW5nSWQ9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY6OTogJ2Vjdmlld0ZvY3VzaW5nSWQ9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZvY3VzPSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJlY3ZpZXdGb2N1c2luZ0lkPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMzAzLDEwICsxMzE5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182OTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Nzo3OiAoICdrZXlTdHJva2VEZWZpbml0aW9uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc6OTogJ2tleVN0cm9rZURlZmluaXRpb24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc6NzogKCAnZm9jdXM9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc6OTogJ2ZvY3VzPScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJrZXlTdHJva2VEZWZpbml0aW9uIik7IAorICAgICAgICAgICAgbWF0Y2goImZvY3VzPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMzI0LDEwICsxMzQwLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODo3OiAoICdrZXlDb2RlPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4Ojk6ICdrZXlDb2RlPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODo3OiAoICdrZXlTdHJva2VEZWZpbml0aW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg6OTogJ2tleVN0cm9rZURlZmluaXRpb24nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgia2V5Q29kZT0iKTsgCisgICAgICAgICAgICBtYXRjaCgia2V5U3Ryb2tlRGVmaW5pdGlvbiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMzQ1LDEwICsxMzYxLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTo3OiAoICdtb2RpZmllcktleXMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTo5OiAnbW9kaWZpZXJLZXlzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5Ojc6ICggJ2tleUNvZGU9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk6OTogJ2tleUNvZGU9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm1vZGlmaWVyS2V5cyIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJrZXlDb2RlPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMzY2LDEwICsxMzgyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDo3OiAoICdmb2N1c2luZ0VuaGFuY2VyJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA6OTogJ2ZvY3VzaW5nRW5oYW5jZXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA6NzogKCAnbW9kaWZpZXJLZXlzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA6OTogJ21vZGlmaWVyS2V5cycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJmb2N1c2luZ0VuaGFuY2VyIik7IAorICAgICAgICAgICAgbWF0Y2goIm1vZGlmaWVyS2V5cyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xMzg3LDEwICsxNDAzLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTo3OiAoICdkZWZhdWx0JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE6OTogJ2RlZmF1bHQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE6NzogKCAnZm9jdXNpbmdFbmhhbmNlcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxOjk6ICdmb2N1c2luZ0VuaGFuY2VyJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImRlZmF1bHQiKTsgCisgICAgICAgICAgICBtYXRjaCgiZm9jdXNpbmdFbmhhbmNlciIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNDA4LDEwICsxNDI0LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mjo3OiAoICdkZWZhdWx0TGF5b3V0aW5nPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyOjk6ICdkZWZhdWx0TGF5b3V0aW5nPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mjo3OiAoICdkZWZhdWx0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI6OTogJ2RlZmF1bHQnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZGVmYXVsdExheW91dGluZz0iKTsgCisgICAgICAgICAgICBtYXRjaCgiZGVmYXVsdCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNDI5LDEwICsxNDQ1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mzo3OiAoICdkZWZhdWx0Rm9jdXNpbmc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM6OTogJ2RlZmF1bHRGb2N1c2luZz0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM6NzogKCAnZGVmYXVsdExheW91dGluZz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mzo5OiAnZGVmYXVsdExheW91dGluZz0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiZGVmYXVsdEZvY3VzaW5nPSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJkZWZhdWx0TGF5b3V0aW5nPSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0xNDUwLDEwICsxNDY2LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDo3OiAoICc7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ6OTogJzsnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ6NzogKCAnZGVmYXVsdEZvY3VzaW5nPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0Ojk6ICdkZWZhdWx0Rm9jdXNpbmc9JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisgICAgICAgICAgICBtYXRjaCgiZGVmYXVsdEZvY3VzaW5nPSIpOyAKKwogCiAgICAgICAgICAgICB9CiAKQEAgLTE0NzAsMTAgKzE0ODcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1Ojc6ICggJ0AnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTo5OiAnQCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTo3OiAoICc7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU6OTogJzsnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnQCcpOyAKKyAgICAgICAgICAgIG1hdGNoKCc7Jyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE0OTAsMTAgKzE1MDcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2Ojc6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njo5OiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njo3OiAoICdAJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY6OTogJ0AnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnKCcpOyAKKyAgICAgICAgICAgIG1hdGNoKCdAJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1MTAsMTAgKzE1MjcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3Ojc6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzo5OiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzo3OiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc6OTogJygnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnKScpOyAKKyAgICAgICAgICAgIG1hdGNoKCcoJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1MzAsMTAgKzE1NDcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgwOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4Ojc6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODo5OiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODo3OiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg6OTogJyknCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnLCcpOyAKKyAgICAgICAgICAgIG1hdGNoKCcpJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1NTAsMTAgKzE1NjcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5Ojc6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTo5OiAnXScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTo3OiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk6OTogJywnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnXScpOyAKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1NzAsMTAgKzE1ODcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwOjc6ICggJyMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDo5OiAnIycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDo3OiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA6OTogJ10nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnIycpOyAKKyAgICAgICAgICAgIG1hdGNoKCddJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE1OTAsMTAgKzE2MDcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxOjc6ICggJ1snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTo5OiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTo3OiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE6OTogJyMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnWycpOyAKKyAgICAgICAgICAgIG1hdGNoKCcjJyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE2MTAsMTEgKzE2MjcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyOjc6ICggJ2luc3RhbmNlb2YnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mjo5OiAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mjo3OiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI6OTogJ1snCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiaW5zdGFuY2VvZiIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJ1snKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMTYzMSwxMCArMTY0NywxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODU7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM6NzogKCAnYXMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mzo5OiAnYXMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM6NzogKCAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzOjk6ICdpbnN0YW5jZW9mJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImFzIik7IAorICAgICAgICAgICAgbWF0Y2goImluc3RhbmNlb2YiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTY1MiwxMCArMTY2OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODY7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ6NzogKCAnaWYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDo5OiAnaWYnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ6NzogKCAnYXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDo5OiAnYXMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiaWYiKTsgCisgICAgICAgICAgICBtYXRjaCgiYXMiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTY3MywxMCArMTY4OSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU6NzogKCAnZWxzZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1Ojk6ICdlbHNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1Ojc6ICggJ2lmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU6OTogJ2lmJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCisgICAgICAgICAgICBtYXRjaCgiaWYiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTY5NCwxMCArMTcxMCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY6NzogKCAnc3dpdGNoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY6OTogJ3N3aXRjaCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Njo3OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY6OTogJ2Vsc2UnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAorICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMTcxNSwxMCArMTczMSwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc6NzogKCAnOicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3Ojk6ICc6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3Ojc6ICggJ3N3aXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3Ojk6ICdzd2l0Y2gnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgnOicpOyAKKyAgICAgICAgICAgIG1hdGNoKCJzd2l0Y2giKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0xNzM1LDExICsxNzUyLDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODo3OiAoICdjYXNlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg6OTogJ2Nhc2UnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg6NzogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4Ojk6ICc6JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNhc2UiKTsgCi0KKyAgICAgICAgICAgIG1hdGNoKCc6Jyk7IAogCiAgICAgICAgICAgICB9CiAKQEAgLTE3NTYsMTAgKzE3NzIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkxOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Ojc6ICggJ2ZvcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Ojk6ICdmb3InCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk6NzogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Ojk6ICdjYXNlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJjYXNlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE3NzcsMTAgKzE3OTMsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkyOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwOjc6ICggJ3doaWxlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA6OTogJ3doaWxlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwOjc6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwOjk6ICdmb3InCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgid2hpbGUiKTsgCisgICAgICAgICAgICBtYXRjaCgiZm9yIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE3OTgsMTAgKzE4MTQsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkzOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxOjc6ICggJ2RvJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE6OTogJ2RvJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxOjc6ICggJ3doaWxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE6OTogJ3doaWxlJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImRvIik7IAorICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4MTksMTAgKzE4MzUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk0OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOjc6ICggJ25ldycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOjk6ICduZXcnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI6NzogKCAnZG8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mjo5OiAnZG8nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgibmV3Iik7IAorICAgICAgICAgICAgbWF0Y2goImRvIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4NDAsMTAgKzE4NTYsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzOjc6ICggJ251bGwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzo5OiAnbnVsbCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzo3OiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzo5OiAnbmV3JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIm51bGwiKTsgCisgICAgICAgICAgICBtYXRjaCgibmV3Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4NjEsMTAgKzE4NzcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0Ojc6ICggJ3R5cGVvZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0Ojk6ICd0eXBlb2YnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ6NzogKCAnbnVsbCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0Ojk6ICdudWxsJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInR5cGVvZiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJudWxsIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE4ODIsMTAgKzE4OTgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk3OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1Ojc6ICggJ3Rocm93JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU6OTogJ3Rocm93JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1Ojc6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1Ojk6ICd0eXBlb2YnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidGhyb3ciKTsgCisgICAgICAgICAgICBtYXRjaCgidHlwZW9mIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5MDMsMTAgKzE5MTksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2Ojc6ICggJ3JldHVybicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2Ojk6ICdyZXR1cm4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY6NzogKCAndGhyb3cnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Njo5OiAndGhyb3cnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAorICAgICAgICAgICAgbWF0Y2goInRocm93Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5MjQsMTAgKzE5NDAsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk5OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3Ojc6ICggJ3RyeScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3Ojk6ICd0cnknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc6NzogKCAncmV0dXJuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc6OTogJ3JldHVybicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJ0cnkiKTsgCisgICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5NDUsMTAgKzE5NjEsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODo4OiAoICdmaW5hbGx5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg6MTA6ICdmaW5hbGx5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4Ojg6ICggJ3RyeScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4OjEwOiAndHJ5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCisgICAgICAgICAgICBtYXRjaCgidHJ5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5NjYsMTAgKzE5ODIsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTo4OiAoICdzeW5jaHJvbml6ZWQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OToxMDogJ3N5bmNocm9uaXplZCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTo4OiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk6MTA6ICdmaW5hbGx5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goInN5bmNocm9uaXplZCIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJmaW5hbGx5Iik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTE5ODcsMTAgKzIwMDMsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA6ODogKCAnY2F0Y2gnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA6MTA6ICdjYXRjaCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA6ODogKCAnc3luY2hyb25pemVkJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwOjEwOiAnc3luY2hyb25pemVkJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goImNhdGNoIik7IAorICAgICAgICAgICAgbWF0Y2goInN5bmNocm9uaXplZCIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMDA4LDEwICsyMDI0LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDM7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxOjg6ICggJz8nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE6MTA6ICc/JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTo4OiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMToxMDogJ2NhdGNoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJz8nKTsgCisgICAgICAgICAgICBtYXRjaCgiY2F0Y2giKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMDI4LDEwICsyMDQ1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyOjg6ICggJyYnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI6MTA6ICcmJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjo4OiAoICc/JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyOjEwOiAnPycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCcmJyk7IAorICAgICAgICAgICAgbWF0Y2goJz8nKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjA0OCwxMSArMjA2NSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA1OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzo4OiAoICducycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzoxMDogJ25zJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzo4OiAoICcmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzOjEwOiAnJicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJucyIpOyAKLQorICAgICAgICAgICAgbWF0Y2goJyYnKTsgCiAKICAgICAgICAgICAgIH0KIApAQCAtMjA2OSwxMCArMjA4NSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDo4OiAoICc6OicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDoxMDogJzo6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDo4OiAoICducycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDoxMDogJ25zJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIjo6Iik7IAorICAgICAgICAgICAgbWF0Y2goIm5zIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTIwOTAsMTAgKzIxMDYsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU6ODogKCAnPy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU6MTA6ICc/LicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU6ODogKCAnOjonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU6MTA6ICc6OicKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKKyAgICAgICAgICAgIG1hdGNoKCI6OiIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMTExLDEwICsyMTI3LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDg7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2Ojg6ICggJ3wnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY6MTA6ICd8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjo4OiAoICc/LicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjoxMDogJz8uJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goJ3wnKTsgCisgICAgICAgICAgICBtYXRjaCgiPy4iKTsgCisKIAogICAgICAgICAgICAgfQogCkBAIC0yMTMxLDExICsyMTQ4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDk7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3Ojg6ICggJ3ZhcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzoxMDogJ3ZhcicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc6ODogKCAnfCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzoxMDogJ3wnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidmFyIik7IAotCisgICAgICAgICAgICBtYXRjaCgnfCcpOyAKIAogICAgICAgICAgICAgfQogCkBAIC0yMTUyLDEwICsyMTY4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4Ojg6ICggJ3RydWUnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg6MTA6ICd0cnVlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODo4OiAoICd2YXInICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg6MTA6ICd2YXInCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgidHJ1ZSIpOyAKKyAgICAgICAgICAgIG1hdGNoKCJ2YXIiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjE2OCwxNSArMjE4NCwzNiBAQAogICAgIH0KICAgICAvLyAkQU5UTFIgZW5kICJUX18xMTAiCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTExKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk6ODogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOToxMDogJ3RydWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJ1ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTEiCisKICAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSEVYIgogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0hFWCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0hFWDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4MjoxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODgyOjEyOiAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4ODoxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjEyOiAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4MjoxMjogKCAnMHgnIHwgJzBYJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODg6MTI6ICggJzB4JyB8ICcwWCcgKQogICAgICAgICAgICAgaW50IGFsdDE9MjsKICAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yMjA0LDcgKzIyNDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODgyOjEzOiAnMHgnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4ODoxMzogJzB4JwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIweCIpOyAKIApAQCAtMjIxMiw3ICsyMjQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODI6MTg6ICcwWCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjE4OiAnMFgnCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goIjBYIik7IAogCkBAIC0yMjIyLDcgKzIyNTksNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4MjoyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4ODoyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKICAgICAgICAgICAgIGludCBjbnQyPTA7CiAgICAgICAgICAgICBsb29wMjoKICAgICAgICAgICAgIGRvIHsKQEAgLTIyNjAsNyArMjI5Nyw3IEBACiAgICAgICAgICAgICAgICAgY250MisrOwogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4Mjo1ODogKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4ODo1ODogKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KICAgICAgICAgICAgIGludCBhbHQ0PTI7CiAgICAgICAgICAgICBpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMjI2OSwxMCArMjMwNiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODgyOjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgnIycpOyAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODgyOjYzOiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODg6NjM6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yMjkwLDcgKzIzMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODI6NjQ6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4ODo2NDogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMjMxNCw3ICsyMzUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4Mjo4NDogKCAnbCcgfCAnTCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4ODo4NDogKCAnbCcgfCAnTCcgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nbCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTIzNTMsMTEgKzIzOTAsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSU5UOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg0OjEwOiAoICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4NDoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDoxMDogKCAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6MTI6ICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaFJhbmdlKCcwJywnOScpOyAKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4NDoyMTogKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6MjE6ICggJzAnIC4uICc5JyB8ICdfJyApKgogICAgICAgICAgICAgbG9vcDU6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDU9MjsKQEAgLTI0MDYsMTEgKzI0NDMsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfREVDSU1BTDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4NjoxNDogKCBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4NjoxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkyOjE0OiAoIFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkyOjE2OiBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODY6MjU6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkyOjI1OiAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8KICAgICAgICAgICAgIGludCBhbHQ3PTI7CiAgICAgICAgICAgICBpbnQgTEE3XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMjQxOSw3ICsyNDU2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg4NjoyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTI6MjY6ICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRSd8fGlucHV0LkxBKDEpPT0nZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0yNDMwLDcgKzI0NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODY6MzY6ICggJysnIHwgJy0nICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MjozNjogKCAnKycgfCAnLScgKT8KICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKICAgICAgICAgICAgICAgICAgICAgaW50IExBNl8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTI0NjMsNyArMjUwMCw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg2OjU4OiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5Mjo1ODogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CiAgICAgICAgICAgICBpbnQgYWx0OD0zOwogICAgICAgICAgICAgaW50IExBOF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTI0NzUsNyArMjUxMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODY6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTI6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTI0OTksNyArMjUzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg2Ojg3OiAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5Mjo4NzogKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdGJ3x8aW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdmJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTI1MzIsMTAgKzI1NjksMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSUQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4ODg6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjExOiAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NDo5OiAoICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTQ6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjExOiAoICdeJyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk0OjExOiAoICdeJyApPwogICAgICAgICAgICAgaW50IGFsdDk9MjsKICAgICAgICAgICAgIGludCBMQTlfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNTQ0LDcgKzI1ODEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk0OjExOiAnXicKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXicpOyAKIApAQCAtMjU2Miw3ICsyNTk5LDcgQEAKICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CiAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODg4OjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk0OjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgogICAgICAgICAgICAgbG9vcDEwOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMD0yOwpAQCAtMjYxMSwxMCArMjY0OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TVFJJTkc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6MTM6ICggKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NjoxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NjoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkwOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTY6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKICAgICAgICAgICAgIGludCBhbHQxNT0yOwogICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNjMyLDEwICsyNjY5LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkwOjE2OiAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk2OjE2OiAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDoyMDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NjoyMDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqCiAgICAgICAgICAgICAgICAgICAgIGxvb3AxMToKICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDExPTM7CkBAIC0yNjUxLDcgKzI2ODgsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDoyMTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTY6MjE6ICdcXFxcJyAuCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKICAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKQEAgLTI2NTksNyArMjY5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6Mjg6IH4gKCAoICdcXFxcJyB8ICdcIicgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk2OjI4OiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSchJyl8fChpbnB1dC5MQSgxKT49JyMnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgewogICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0yNjc5LDcgKzI3MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6NDQ6ICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTY6NDQ6ICggJ1wiJyApPwogICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTI9MjsKICAgICAgICAgICAgICAgICAgICAgaW50IExBMTJfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNjg4LDcgKzI3MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkwOjQ0OiAnXCInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk2OjQ0OiAnXCInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKIApAQCAtMjcwMSwxMCArMjczOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDo0OTogJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5Njo0OTogJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk2OjU0OiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqCiAgICAgICAgICAgICAgICAgICAgIGxvb3AxMzoKICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzPTM7CkBAIC0yNzIwLDcgKzI3NTcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CiAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDo1NTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTY6NTU6ICdcXFxcJyAuCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKICAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKQEAgLTI3MjgsNyArMjc2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTA6NjI6IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5Njo2MjogfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyYnKXx8KGlucHV0LkxBKDEpPj0nKCcgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTI3NDgsNyArMjc4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDo3OTogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTY6Nzk6ICggJ1xcJycgKT8KICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0PTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMjc1Nyw3ICsyNzk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5MDo3OTogJ1xcJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTY6Nzk6ICdcXCcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKIApAQCAtMjc4OCwxMiArMjgyNSwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9NTF9DT01NRU5UOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkyOjE3OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkyOjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTg6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTg6MTk6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIG1hdGNoKCIvKiIpOyAKIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODkyOjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5ODoyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCiAgICAgICAgICAgICBsb29wMTY6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CkBAIC0yODE4LDcgKzI4NTUsNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5Mjo1MjogLgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTg6NTI6IC4KICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKIApAQCAtMjg0OCwxMiArMjg4NSwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TTF9DT01NRU5UOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk0OjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTQ6MTk6ICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwOTAwOjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDA6MTk6ICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goIi8vIik7IAogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4OTQ6MjQ6ICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwOTAwOjI0OiAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSoKICAgICAgICAgICAgIGxvb3AxNzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTc9MjsKQEAgLTI4NjYsNyArMjkwMyw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk0OjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDA6MjQ6IH4gKCAoICdcXG4nIHwgJ1xccicgKSApCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nXHQnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBCJyAmJiBpbnB1dC5MQSgxKTw9J1xmJyl8fChpbnB1dC5MQSgxKT49J1x1MDAwRScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTI4ODYsNyArMjkyMyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NDo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDA6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPwogICAgICAgICAgICAgaW50IGFsdDE5PTI7CiAgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTI4OTUsOSArMjkzMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk0OjQxOiAoICdcXHInICk/ICdcXG4nCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDkwMDo0MTogKCAnXFxyJyApPyAnXFxuJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NDo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDA6NDE6ICggJ1xccicgKT8KICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE4PTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTE4XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMjkwNiw3ICsyOTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NDo0MTogJ1xccicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDA6NDE6ICdcXHInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKIApAQCAtMjkzOCwxMCArMjk3NSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5Njo5OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NjoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDkwMjo5OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDkwMjoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg5NjoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDkwMjoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKICAgICAgICAgICAgIGludCBjbnQyMD0wOwogICAgICAgICAgICAgbG9vcDIwOgogICAgICAgICAgICAgZG8gewpAQCAtMjk5NSw4ICszMDMyLDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfQU5ZX09USEVSOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk4OjE2OiAoIC4gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODk4OjE4OiAuCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDQ6MTY6ICggLiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA5MDQ6MTg6IC4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIG1hdGNoQW55KCk7IAogCkBAIC0zMDExLDggKzMwNDgsOCBAQAogICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfQU5ZX09USEVSIgogCiAgICAgcHVibGljIHZvaWQgbVRva2VucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCi0gICAgICAgIGludCBhbHQyMT0xMDc7CisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgVF9fMTExIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCisgICAgICAgIGludCBhbHQyMT0xMDg7CiAgICAgICAgIGFsdDIxID0gZGZhMjEucHJlZGljdChpbnB1dCk7CiAgICAgICAgIHN3aXRjaCAoYWx0MjEpIHsKICAgICAgICAgICAgIGNhc2UgMSA6CkBAIC0zNzAyLDYzICszNzM5LDcwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA5OSA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjA5OiBSVUxFX0hFWAorICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjYwOTogVF9fMTExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjE2OiBSVUxFX0hFWAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9IRVgoKTsgCiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwMCA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjE4OiBSVUxFX0lOVAorICAgICAgICAgICAgY2FzZSAxMDEgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjYyNTogUlVMRV9JTlQKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDEgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjYyNzogUlVMRV9ERUNJTUFMCisgICAgICAgICAgICBjYXNlIDEwMiA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjM0OiBSVUxFX0RFQ0lNQUwKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfREVDSU1BTCgpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAyIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2NDA6IFJVTEVfSUQKKyAgICAgICAgICAgIGNhc2UgMTAzIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2NDc6IFJVTEVfSUQKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfSUQoKTsgCiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwMyA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjQ4OiBSVUxFX1NUUklORworICAgICAgICAgICAgY2FzZSAxMDQgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjY1NTogUlVMRV9TVFJJTkcKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDQgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjY2MDogUlVMRV9NTF9DT01NRU5UCisgICAgICAgICAgICBjYXNlIDEwNSA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjY3OiBSVUxFX01MX0NPTU1FTlQKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfTUxfQ09NTUVOVCgpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA1IDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2NzY6IFJVTEVfU0xfQ09NTUVOVAorICAgICAgICAgICAgY2FzZSAxMDYgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjY4MzogUlVMRV9TTF9DT01NRU5UCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1SVUxFX1NMX0NPTU1FTlQoKTsgCiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwNiA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjkyOiBSVUxFX1dTCisgICAgICAgICAgICBjYXNlIDEwNyA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6Njk5OiBSVUxFX1dTCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1SVUxFX1dTKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDcgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjcwMDogUlVMRV9BTllfT1RIRVIKKyAgICAgICAgICAgIGNhc2UgMTA4IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo3MDc6IFJVTEVfQU5ZX09USEVSCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1SVUxFX0FOWV9PVEhFUigpOyAKIApAQCAtMzc3MiwxNyArMzgxNiwxNyBAQAogCiAgICAgcHJvdGVjdGVkIERGQTIxIGRmYTIxID0gbmV3IERGQTIxKHRoaXMpOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW90UyA9Ci0gICAgICAgICJcMVx1ZmZmZlwxXDcxXDFcNzNcMVw3NVwxXDEwMFwxXDEwNFwxXDEwN1wxXDExM1wxXDExNVwxXDExN1wxXDEyMVwxXDEyM1wxXDEyNVwxXDEzMFwxNFwxMzJcMlx1ZmZmZlw1XDEzMlwxMFx1ZmZmZlwxXDEzMlwxXHUwMDg0XDRcMTMyXDJcdTAwOGRcMVw2Nlw1XHVmZmZmXDFcdTAwOTJcMjZcdWZmZmZcMVx1MDA5NFw1XHVmZmZmXDFcdTAwOTZcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDExXDEzMlwxXHUwMGEzXDEyXDEzMlwyXHVmZmZmXDEwXDEzMlwxXHUwMGI4XDEwXHVmZmZmXDFcdTAwYjlcMlx1ZmZmZlw0XDEzMlwxXHUwMGJmXDFcMTMyXDFcdWZmZmZcMVx1MDA4ZFwxMlx1ZmZmZlwxXHUwMGMxXDFcdTAwYzJcMTJcMTMyXDFcdWZmZmZcMlwxMzJcMVx1MDBjZlw1XDEzMlwxXHUwMGQ2XDVcMTMyXDFcdTAwZGNcNVwxMzJcMlx1ZmZmZlwzXDEzMlwxXHUwMGU2XDFcMTMyXDFcdWZmZmZcMVwxMzJcMlx1ZmZmZlwyXDEzMlwxXHUwMGViXDExXDEzMlwxXHVmZmZmXDNcMTMyXDFcdTAwZjhcMlwxMzJcMVx1ZmZmZlw1XDEzMlwxXHVmZmZmXDFcdTAxMDFcNVwxMzJcMVx1MDEwN1wyXDEzMlwxXHVmZmZmXDFcdTAxMGFcM1wxMzJcMVx1ZmZmZlwyXDEzMlwxXHUwMTExXDRcMTMyXDFcdTAxMTZcNFwxMzJcMVx1ZmZmZlwxXHUwMTFjXDFcdTAxMWRcNVwxMzJcMVx1MDEyM1wxXHVmZmZmXDVcMTMyXDFcdWZmZmZcMVx1MDEyOVwxXHUwMTJhXDFcdWZmZmZcNFwxMzJcMVx1MDEyZlwxXDEzMlwxXHVmZmZmXDFcdTAxMzFcMVwxMzJcMVx1MDEzM1wxXDEzMlwxXHVmZmZmXDFcMTMyXDFcdWZmZmZcM1wxMzJcMlx1ZmZmZlw0XDEzMlwxXHUwMTNkXDFcdWZmZmZcNVwxMzJcMlx1ZmZmZlwxXHUwMTQ0XDFcdTAxNDVcMlwxMzJcMVx1ZmZmZlwxXDEzMlwxXHVmZmZmXDFcMTMyXDFcdWZmZmZcMlwxMzJcMVx1MDE0Y1wyXDEzMlwxXHUwMTRmXDFcMTMyXDFcdTAxNTFcMVx1MDE1MlwxXHVmZmZmXDFcMTMyXDFcdWZmZmZcM1wxMzJcMVx1MDE1OVwyXHVmZmZmXDJcMTMyXDFcdTAxNWNcM1wxMzJcMVx1ZmZmZlwxXDEzMlwxXHUwMTYyXDFcdWZmZmZcMVx1MDE2M1wyXHVmZmZmXDJcMTMyXDFcdWZmZmZcM1wxMzJcMVx1ZmZmZlwxXHUwMTY5XDFcMTMyXDFcdWZmZmZcNVwxMzJcMlx1ZmZmZlw1XDEzMlwxXHVmZmZmXDJcMTMyXDFcdTAxNzdcMlwxMzJcMVx1MDE3YVw3XDEzMlwxXHVmZmZmXDJcMTMyXDFcdWZmZmZcNlwxMzJcMVx1MDE4YVw0XDEzMlwxXHUwMThmXDNcMTMyXDFcdWZmZmZcNFwxMzJcMVx1ZmZmZlwyMVwxMzJcMVx1MDFhOFwxXHUwMWE5XDNcMTMyXDRcdWZmZmZcMVx1MDFhZFwxXDEzMlwyXHVmZmZmXDFcMTMyXDFcdTAxYjBcMVx1ZmZmZiI7CisgICAgICAgICJcMVx1ZmZmZlwxXDcxXDFcNzNcMVw3NVwxXDEwMFwxXDEwNFwxXDEwN1wxXDExM1wxXDExNVwxXDExN1wxXDEyMVwxXDEyM1wxXDEyNVwxXDEzMFwxNFwxMzJcMlx1ZmZmZlw1XDEzMlwxMFx1ZmZmZlwxXDEzMlwxXHUwMDg0XDRcMTMyXDJcdTAwOGRcMVw2Nlw1XHVmZmZmXDFcdTAwOTJcMjZcdWZmZmZcMVx1MDA5NFw1XHVmZmZmXDFcdTAwOTZcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDExXDEzMlwxXHUwMGEzXDEyXDEzMlwyXHVmZmZmXDEwXDEzMlwxXHUwMGI4XDEwXHVmZmZmXDFcdTAwYjlcMlx1ZmZmZlw0XDEzMlwxXHUwMGJmXDFcMTMyXDFcdWZmZmZcMVx1MDA4ZFwxMlx1ZmZmZlwxXHUwMGMxXDFcdTAwYzJcMTJcMTMyXDFcdWZmZmZcMlwxMzJcMVx1MDBjZlw1XDEzMlwxXHUwMGQ2XDVcMTMyXDFcdTAwZGNcNVwxMzJcMlx1ZmZmZlwzXDEzMlwxXHUwMGU2XDFcMTMyXDFcdWZmZmZcMVwxMzJcMlx1ZmZmZlwyXDEzMlwxXHUwMGViXDExXDEzMlwxXHVmZmZmXDNcMTMyXDFcdTAwZjhcMVx1MDBmYlwxXDEzMlwxXHVmZmZmXDVcMTMyXDFcdWZmZmZcMVx1MDEwMlw1XDEzMlwxXHUwMTA4XDJcMTMyXDFcdWZmZmZcMVx1MDEwYlwzXDEzMlwxXHVmZmZmXDJcMTMyXDFcdTAxMTJcNFwxMzJcMVx1MDExN1w0XDEzMlwxXHVmZmZmXDFcdTAxMWRcMVx1MDExZVwxXHVmZmZmXDVcMTMyXDFcdTAxMjRcMVx1ZmZmZlw1XDEzMlwxXHVmZmZmXDFcdTAxMmFcMVx1MDEyYlwxXHVmZmZmXDRcMTMyXDFcdTAxMzBcMVwxMzJcMVx1ZmZmZlwxXHUwMTMyXDFcMTMyXDFcdTAxMzRcMVwxMzJcMVx1ZmZmZlwxXDEzMlwxXHVmZmZmXDNcMTMyXDJcdWZmZmZcNFwxMzJcMVx1MDEzZVwxXHVmZmZmXDVcMTMyXDJcdWZmZmZcMVx1MDE0NVwxXHUwMTQ2XDJcMTMyXDFcdWZmZmZcMVwxMzJcMVx1ZmZmZlwxXDEzMlwxXHVmZmZmXDJcMTMyXDFcdTAxNGRcMlwxMzJcMVx1MDE1MFwxXDEzMlwxXHUwMTUyXDFcdTAxNTNcMVx1ZmZmZlwxXDEzMlwxXHVmZmZmXDNcMTMyXDFcdTAxNWFcMlx1ZmZmZlwyXDEzMlwxXHUwMTVkXDNcMTMyXDFcdWZmZmZcMVwxMzJcMVx1MDE2M1wxXHVmZmZmXDFcdTAxNjRcMlx1ZmZmZlwyXDEzMlwxXHVmZmZmXDNcMTMyXDFcdWZmZmZcMVx1MDE2YVwxXDEzMlwxXHVmZmZmXDVcMTMyXDJcdWZmZmZcNVwxMzJcMVx1ZmZmZlwyXDEzMlwxXHUwMTc4XDJcMTMyXDFcdTAxN2JcN1wxMzJcMVx1ZmZmZlwyXDEzMlwxXHVmZmZmXDZcMTMyXDFcdTAxOGJcNFwxMzJcMVx1MDE5MFwzXDEzMlwxXHVmZmZmXDRcMTMyXDFcdWZmZmZcMjFcMTMyXDFcdTAxYTlcMVx1MDFhYVwzXDEzMlw0XHVmZmZmXDFcdTAxYWVcMVwxMzJcMlx1ZmZmZlwxXDEzMlwxXHUwMWIxXDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW9mUyA9Ci0gICAgICAgICJcdTAxYjFcdWZmZmYiOworICAgICAgICAiXHUwMWIyXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21pblMgPQotICAgICAgICAiXDFcMFwxXDc1XDFcMTc0XDFcNDZcMVw1M1wxXDU1XDJcNTJcM1w3NVwxXDc2XDJcNTZcMVwxNDFcMVwxNDNcMVwxNjRcMVwxNDZcMVwxNDFcMVwxNTdcMVwxNDVcMVwxNjJcMVwxNTdcMVwxNjNcMlwxNDFcMlx1ZmZmZlwyXDE0MVwxXDE0NVwxXDE1N1wxXDE0NVwxMFx1ZmZmZlwxXDE2M1wxXDcyXDFcMTQxXDFcMTUwXDJcMTQ1XDJcNjBcMVw0NFw1XHVmZmZmXDFcNzVcMjZcdWZmZmZcMVw3NVw1XHVmZmZmXDFcNzRcNFx1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcMTY0XDFcMTY2XDFcMTYzXDFcMTQxXDFcMTYwXDFcMTUxXDFcMTU2XDFcMTYwXDFcMTYzXDFcNDRcMVwxNTRcMVwxNDNcMVwxNTZcMlwxNjJcMVwxNTFcMVwxNjJcMVwxNjNcMlwxNDNcMlx1ZmZmZlwxXDE2MlwxXDE2MFwxXDE2MlwxXDE2NVwyXDE3MVwxXDE0NFwxXDE0NlwxXDQ0XDEwXHVmZmZmXDFcNDRcMlx1ZmZmZlwxXDE2M1wxXDE1MVwxXDE2N1wxXDE1NFwxXDQ0XDFcMTY0XDFcdWZmZmZcMVw2MFwxMlx1ZmZmZlwyXDQ0XDFcMTQ1XDFcMTUxXDFcMTQ1XDFcMTY0XDFcMTQxXDFcMTQ1XDFcMTY0XDFcMTQzXDFcMTU3XDFcMTY0XDFcdWZmZmZcMVwxNjNcMVwxNjVcMVw0NFwxXDE0MVwxXDE1MVwxXDE2NFwxXDE0NFwxXDE1NVwxXDQ0XDJcMTUzXDFcMTQ3XDFcMTQ1XDFcMTU3XDFcNDRcMVwxNDVcMVwxNTdcMVwxMDNcMVwxNTFcMVwxNDFcMlx1ZmZmZlwxXDE0NVwxXDE0M1wxXDE1NFwxXDQ0XDFcMTU0XDFcdWZmZmZcMVwxNjVcMlx1ZmZmZlwxXDE1NlwxXDE0NVwxXDQ0XDFcMTUxXDFcMTY0XDFcMTYyXDFcMTQzXDFcMTUwXDFcMTYyXDFcMTQxXDFcMTQ1XDFcMTYzXDFcdWZmZmZcMVwxNTRcMVwxNzJcMVwxNTFcMVw0NFwxXDYyXDFcMTQxXDFcdWZmZmZcMVwxNjdcMVwxNDFcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDQ0XDFcMTY1XDFcMTY0XDFcMTU3XDFcMTQ2XDFcMTY1XDFcNDRcMVwxNTBcMVwxNDVcMVx1ZmZmZlwxXDQ0XDFcMTYyXDFcMTQ0XDFcMTY3XDFcdWZmZmZcMVwxNDNcMVwxNDVcMVw0NFwxXDE1MFwxXDE2MlwxXDE2NFwxXDE1NlwxXDQ0XDFcNzVcMVwxNTRcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDQ0XDFcMTYyXDFcMTQxXDFcMTQ3XDFcMTY0XDFcMTQ2XDFcNDRcMVx1ZmZmZlwxXDE2NFwxXDE2MlwxXDE0NFwxXDE1MVwxXDE1NFwxXHVmZmZmXDJcNDRcMVx1ZmZmZlwxXDE1NlwxXDE2M1wxXDE1MVwxXDEwNlwxXDQ0XDFcMTQ3XDFcdWZmZmZcMVw0NFwxXDE1N1wxXDQ0XDFcMTQzXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE3MVwxXDE1NlwxXDE0MVwyXHVmZmZmXDFcMTQ0XDFcMTYyXDFcMTQ1XDFcMTYzXDFcNDRcMVx1ZmZmZlwxXDc1XDFcMTU3XDJcMTQ1XDFcMTY0XDJcdWZmZmZcMlw0NFwyXDE1N1wxXHVmZmZmXDFcMTcxXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE0NVwxXDE0N1wxXDQ0XDFcMTY0XDFcMTU0XDFcNDRcMVwxNDRcMlw0NFwxXHVmZmZmXDFcMTU2XDFcdWZmZmZcMVwxNTNcMVw3NVwxXDE2MlwxXDQ0XDJcdWZmZmZcMVwxNTZcMVwxNDNcMVw0NFwxXDE1MVwxXDE1N1wxXDEwNVwxXHVmZmZmXDFcMTQxXDFcNDRcMVx1ZmZmZlwxXDQ0XDJcdWZmZmZcMVwxNDdcMVwxNDVcMVx1ZmZmZlwxXDExM1wxXDE0MVwxXDE1N1wxXHVmZmZmXDFcNDRcMVwxNjVcMVx1ZmZmZlwxXDE3MlwxXDE0NlwxXDE2NFwxXDE1NlwxXDE1NFwyXHVmZmZmXDFcMTIzXDFcMTA0XDFcMTQ1XDFcMTcxXDFcMTQzXDFcdWZmZmZcMVwxNjNcMVwxNDVcMVw0NFwxXDE2MlwxXDE1MFwxXDQ0XDFcMTY0XDFcMTQ1XDFcMTcxXDFcMTU3XDFcMTY1XDFcMTUxXDFcMTQ0XDFcdWZmZmZcMlwxNDFcMVx1ZmZmZlwxXDE2MlwxXDE0NlwxXDE2M1wxXDE2NVwxXDE2M1wxXDE1NlwxXDQ0XDFcMTY0XDFcMTU2XDFcMTQxXDFcMTUxXDFcNDRcMVwxNjRcMVwxNTFcMVwxNDdcMVx1ZmZmZlwxXDE0NVwxXDE0M1wxXDE2NFwxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTU2XDFcMTExXDFcMTQ3XDJcMTQ1XDFcMTUxXDFcMTU2XDFcMTQ3XDFcMTQ0XDFcMTcxXDFcMTYyXDFcMTQ3XDFcMTY0XDFcMTQ3XDJcNzVcMlw0NFwxXDE3MVwxXDE1MVwxXDc1XDRcdWZmZmZcMVw0NFwxXDE1N1wyXHVmZmZmXDFcMTU2XDFcNDRcMVx1ZmZmZiI7CisgICAgICAgICJcMVwwXDFcNzVcMVwxNzRcMVw0NlwxXDUzXDFcNTVcMlw1MlwzXDc1XDFcNzZcMlw1NlwxXDE0MVwxXDE0M1wxXDE2NFwxXDE0NlwxXDE0MVwxXDE1N1wxXDE0NVwxXDE2MlwxXDE1N1wxXDE2M1wyXDE0MVwyXHVmZmZmXDJcMTQxXDFcMTQ1XDFcMTU3XDFcMTQ1XDEwXHVmZmZmXDFcMTYzXDFcNzJcMVwxNDFcMVwxNTBcMlwxNDVcMlw2MFwxXDQ0XDVcdWZmZmZcMVw3NVwyNlx1ZmZmZlwxXDc1XDVcdWZmZmZcMVw3NFw0XHVmZmZmXDFcMTU0XDFcdWZmZmZcMVwxNjRcMVwxNjZcMVwxNjNcMVwxNDFcMVwxNjBcMVwxNTFcMVwxNTZcMVwxNjBcMVwxNjNcMVw0NFwxXDE1NFwxXDE0M1wxXDE1NlwyXDE2MlwxXDE1MVwxXDE2MlwxXDE2M1wyXDE0M1wyXHVmZmZmXDFcMTYyXDFcMTYwXDFcMTYyXDFcMTY1XDJcMTcxXDFcMTQ0XDFcMTQ2XDFcNDRcMTBcdWZmZmZcMVw0NFwyXHVmZmZmXDFcMTYzXDFcMTUxXDFcMTY3XDFcMTU0XDFcNDRcMVwxNjRcMVx1ZmZmZlwxXDYwXDEyXHVmZmZmXDJcNDRcMVwxNDVcMVwxNTFcMVwxNDVcMVwxNjRcMVwxNDFcMVwxNDVcMVwxNjRcMVwxNDNcMVwxNTdcMVwxNjRcMVx1ZmZmZlwxXDE2M1wxXDE2NVwxXDQ0XDFcMTQxXDFcMTUxXDFcMTY0XDFcMTQ0XDFcMTU1XDFcNDRcMlwxNTNcMVwxNDdcMVwxNDVcMVwxNTdcMVw0NFwxXDE0NVwxXDE1N1wxXDEwM1wxXDE1MVwxXDE0MVwyXHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTU0XDFcNDRcMVwxNTRcMVx1ZmZmZlwxXDE2NVwyXHVmZmZmXDFcMTU2XDFcMTQ1XDFcNDRcMVwxNTFcMVwxNjRcMVwxNjJcMVwxNDNcMVwxNTBcMVwxNjJcMVwxNDFcMVwxNDVcMVwxNjNcMVx1ZmZmZlwxXDE1NFwxXDE3MlwxXDE1MVwyXDQ0XDFcMTQxXDFcdWZmZmZcMVwxNjdcMVwxNDFcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDQ0XDFcMTY1XDFcMTY0XDFcMTU3XDFcMTQ2XDFcMTY1XDFcNDRcMVwxNTBcMVwxNDVcMVx1ZmZmZlwxXDQ0XDFcMTYyXDFcMTQ0XDFcMTY3XDFcdWZmZmZcMVwxNDNcMVwxNDVcMVw0NFwxXDE1MFwxXDE2MlwxXDE2NFwxXDE1NlwxXDQ0XDFcNzVcMVwxNTRcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDQ0XDFcdWZmZmZcMVwxNjJcMVwxNDFcMVwxNDdcMVwxNjRcMVwxNDZcMVw0NFwxXHVmZmZmXDFcMTY0XDFcMTYyXDFcMTQ0XDFcMTUxXDFcMTU0XDFcdWZmZmZcMlw0NFwxXHVmZmZmXDFcMTU2XDFcMTYzXDFcMTUxXDFcMTA2XDFcNDRcMVwxNDdcMVx1ZmZmZlwxXDQ0XDFcMTU3XDFcNDRcMVwxNDNcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcMTcxXDFcMTU2XDFcMTQxXDJcdWZmZmZcMVwxNDRcMVwxNjJcMVwxNDVcMVwxNjNcMVw0NFwxXHVmZmZmXDFcNzVcMVwxNTdcMlwxNDVcMVwxNjRcMlx1ZmZmZlwyXDQ0XDJcMTU3XDFcdWZmZmZcMVwxNzFcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcMTQ1XDFcMTQ3XDFcNDRcMVwxNjRcMVwxNTRcMVw0NFwxXDE0NFwyXDQ0XDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE1M1wxXDc1XDFcMTYyXDFcNDRcMlx1ZmZmZlwxXDE1NlwxXDE0M1wxXDQ0XDFcMTUxXDFcMTU3XDFcMTA1XDFcdWZmZmZcMVwxNDFcMVw0NFwxXHVmZmZmXDFcNDRcMlx1ZmZmZlwxXDE0N1wxXDE0NVwxXHVmZmZmXDFcMTEzXDFcMTQxXDFcMTU3XDFcdWZmZmZcMVw0NFwxXDE2NVwxXHVmZmZmXDFcMTcyXDFcMTQ2XDFcMTY0XDFcMTU2XDFcMTU0XDJcdWZmZmZcMVwxMjNcMVwxMDRcMVwxNDVcMVwxNzFcMVwxNDNcMVx1ZmZmZlwxXDE2M1wxXDE0NVwxXDQ0XDFcMTYyXDFcMTUwXDFcNDRcMVwxNjRcMVwxNDVcMVwxNzFcMVwxNTdcMVwxNjVcMVwxNTFcMVwxNDRcMVx1ZmZmZlwyXDE0MVwxXHVmZmZmXDFcMTYyXDFcMTQ2XDFcMTYzXDFcMTY1XDFcMTYzXDFcMTU2XDFcNDRcMVwxNjRcMVwxNTZcMVwxNDFcMVwxNTFcMVw0NFwxXDE2NFwxXDE1MVwxXDE0N1wxXHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTY0XDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNTZcMVwxMTFcMVwxNDdcMlwxNDVcMVwxNTFcMVwxNTZcMVwxNDdcMVwxNDRcMVwxNzFcMVwxNjJcMVwxNDdcMVwxNjRcMVwxNDdcMlw3NVwyXDQ0XDFcMTcxXDFcMTUxXDFcNzVcNFx1ZmZmZlwxXDQ0XDFcMTU3XDJcdWZmZmZcMVwxNTZcMVw0NFwxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21heFMgPQotICAgICAgICAiXDFcdWZmZmZcMVw3NlwxXDE3NFwxXDQ2XDFcNzVcMVw3Nlw1XDc1XDFcNzZcMVw1NlwxXDcyXDFcMTQxXDFcMTcwXDFcMTcxXDFcMTU2XDJcMTU3XDFcMTQ1XDFcMTYyXDFcMTU3XDFcMTYzXDJcMTQxXDJcdWZmZmZcMVwxNzFcMVwxNDFcMVwxNDVcMlwxNTdcMTBcdWZmZmZcMVwxNjNcMVw3MlwxXDE0MVwxXDE1MFwxXDE2NVwxXDE0NVwxXDE3MFwxXDE1NFwxXDE3Mlw1XHVmZmZmXDFcNzVcMjZcdWZmZmZcMVw3NVw1XHVmZmZmXDFcNzRcNFx1ZmZmZlwxXDE2MlwxXHVmZmZmXDFcMTY0XDFcMTY2XDFcMTYzXDFcMTYyXDFcMTYwXDFcMTUxXDFcMTU2XDFcMTYwXDFcMTYzXDFcMTcyXDFcMTU0XDFcMTYyXDFcMTU2XDJcMTYyXDFcMTUxXDFcMTYyXDFcMTYzXDJcMTQzXDJcdWZmZmZcMVwxNjJcMVwxNjBcMVwxNjJcM1wxNzFcMVwxNDRcMVwxNDZcMVwxNzJcMTBcdWZmZmZcMVwxNzJcMlx1ZmZmZlwxXDE2NFwxXDE1MVwxXDE2N1wxXDE1NFwxXDE3MlwxXDE2NFwxXHVmZmZmXDFcMTU0XDEyXHVmZmZmXDJcMTcyXDFcMTQ1XDFcMTUxXDFcMTQ1XDFcMTY0XDFcMTQxXDFcMTQ1XDFcMTY0XDFcMTQzXDFcMTU3XDFcMTY0XDFcdWZmZmZcMVwxNjNcMVwxNjVcMVwxNzJcMVwxNDFcMVwxNTFcMVwxNjRcMVwxNDRcMVwxNjdcMVwxNzJcMlwxNTNcMVwxNDdcMVwxNDVcMVwxNTdcMVwxNzJcMVwxNDVcMVwxNTdcMVwxMjNcMVwxNTFcMVwxNDFcMlx1ZmZmZlwxXDE0NVwxXDE0M1wxXDE1NFwxXDE3MlwxXDE1NFwxXHVmZmZmXDFcMTY1XDJcdWZmZmZcMVwxNTZcMVwxNDVcMVwxNzJcMVwxNTFcMVwxNjRcMVwxNjJcMVwxNDNcMVwxNTBcMVwxNjJcMVwxNDFcMVwxNDVcMVwxNjNcMVx1ZmZmZlwxXDE1NFwxXDE3MlwxXDE1MVwxXDE3MlwxXDYzXDFcMTQxXDFcdWZmZmZcMVwxNjdcMVwxNDFcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDE3MlwxXDE2NVwxXDE2NFwxXDE1N1wxXDE0NlwxXDE2NVwxXDE3MlwxXDE1MFwxXDE0NVwxXHVmZmZmXDFcMTcyXDFcMTYyXDFcMTYzXDFcMTY3XDFcdWZmZmZcMVwxNDNcMVwxNDVcMVwxNzJcMVwxNTBcMVwxNjJcMVwxNjRcMVwxNTZcMVwxNzJcMVwxNTFcMVwxNTRcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDE3MlwxXDE2MlwxXDE0MVwxXDE0N1wxXDE2NFwxXDE0NlwxXDE3MlwxXHVmZmZmXDFcMTY0XDFcMTYyXDFcMTQ0XDFcMTUxXDFcMTU0XDFcdWZmZmZcMlwxNzJcMVx1ZmZmZlwxXDE1NlwxXDE2M1wxXDE1MVwxXDEwNlwxXDE3MlwxXDE0N1wxXHVmZmZmXDFcMTcyXDFcMTU3XDFcMTcyXDFcMTQzXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE3MVwxXDE1NlwxXDE0MVwyXHVmZmZmXDFcMTQ0XDFcMTYyXDFcMTQ1XDFcMTYzXDFcMTcyXDFcdWZmZmZcMVwxNTFcMVwxNTdcMlwxNDVcMVwxNjRcMlx1ZmZmZlwyXDE3MlwyXDE1N1wxXHVmZmZmXDFcMTcxXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE0NVwxXDE0N1wxXDE3MlwxXDE2NFwxXDE1NFwxXDE3MlwxXDE0NFwyXDE3MlwxXHVmZmZmXDFcMTU2XDFcdWZmZmZcMVwxNTNcMVw3NVwxXDE2MlwxXDE3MlwyXHVmZmZmXDFcMTU2XDFcMTQzXDFcMTcyXDFcMTUxXDFcMTU3XDFcMTIzXDFcdWZmZmZcMVwxNDFcMVwxNzJcMVx1ZmZmZlwxXDE3MlwyXHVmZmZmXDFcMTQ3XDFcMTQ1XDFcdWZmZmZcMVwxMTNcMVwxNDFcMVwxNTdcMVx1ZmZmZlwxXDE3MlwxXDE2NVwxXHVmZmZmXDFcMTcyXDFcMTQ2XDFcMTY0XDFcMTU2XDFcMTU0XDJcdWZmZmZcMVwxMjNcMVwxMDRcMVwxNDVcMVwxNzFcMVwxNDNcMVx1ZmZmZlwxXDE2M1wxXDE0NVwxXDE3MlwxXDE2MlwxXDE1MFwxXDE3MlwxXDE2NFwxXDE0NVwxXDE3MVwxXDE1N1wxXDE2NVwxXDE1MVwxXDE0NFwxXHVmZmZmXDJcMTQxXDFcdWZmZmZcMVwxNjJcMVwxNDZcMVwxNjNcMVwxNjVcMVwxNjNcMVwxNTZcMVwxNzJcMVwxNjRcMVwxNTZcMVwxNDFcMVwxNTFcMVwxNzJcMVwxNjRcMVwxNTFcMVwxNDdcMVx1ZmZmZlwxXDE0NVwxXDE0M1wxXDE2NFwxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTU2XDFcMTExXDFcMTQ3XDJcMTQ1XDFcMTUxXDFcMTU2XDFcMTQ3XDFcMTQ0XDFcMTcxXDFcMTYyXDFcMTQ3XDFcMTY0XDFcMTQ3XDJcNzVcMlwxNzJcMVwxNzFcMVwxNTFcMVw3NVw0XHVmZmZmXDFcMTcyXDFcMTU3XDJcdWZmZmZcMVwxNTZcMVwxNzJcMVx1ZmZmZiI7CisgICAgICAgICJcMVx1ZmZmZlwxXDc2XDFcMTc0XDFcNDZcMVw3NVwxXDc2XDVcNzVcMVw3NlwxXDU2XDFcNzJcMVwxNDFcMVwxNzBcMVwxNzFcMVwxNTZcMlwxNTdcMVwxNDVcMVwxNjJcMVwxNTdcMVwxNjNcMlwxNDFcMlx1ZmZmZlwxXDE3MVwxXDE0MVwxXDE0NVwyXDE1N1wxMFx1ZmZmZlwxXDE2M1wxXDcyXDFcMTQxXDFcMTUwXDFcMTY1XDFcMTQ1XDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmZcMVw3NVwyNlx1ZmZmZlwxXDc1XDVcdWZmZmZcMVw3NFw0XHVmZmZmXDFcMTYyXDFcdWZmZmZcMVwxNjRcMVwxNjZcMVwxNjNcMVwxNjJcMVwxNjBcMVwxNTFcMVwxNTZcMVwxNjBcMVwxNjNcMVwxNzJcMVwxNTRcMVwxNjJcMVwxNTZcMlwxNjJcMVwxNTFcMVwxNjJcMVwxNjNcMlwxNDNcMlx1ZmZmZlwxXDE2MlwxXDE2MFwxXDE2MlwzXDE3MVwxXDE0NFwxXDE0NlwxXDE3MlwxMFx1ZmZmZlwxXDE3MlwyXHVmZmZmXDFcMTY0XDFcMTUxXDFcMTY3XDFcMTU0XDFcMTcyXDFcMTY0XDFcdWZmZmZcMVwxNTRcMTJcdWZmZmZcMlwxNzJcMVwxNDVcMVwxNTFcMVwxNDVcMVwxNjRcMVwxNDFcMVwxNDVcMVwxNjRcMVwxNDNcMVwxNTdcMVwxNjRcMVx1ZmZmZlwxXDE2M1wxXDE2NVwxXDE3MlwxXDE0MVwxXDE1MVwxXDE2NFwxXDE0NFwxXDE2N1wxXDE3MlwyXDE1M1wxXDE0N1wxXDE0NVwxXDE1N1wxXDE3MlwxXDE0NVwxXDE1N1wxXDEyM1wxXDE1MVwxXDE0MVwyXHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTU0XDFcMTcyXDFcMTU0XDFcdWZmZmZcMVwxNjVcMlx1ZmZmZlwxXDE1NlwxXDE0NVwxXDE3MlwxXDE1MVwxXDE2NFwxXDE2MlwxXDE0M1wxXDE1MFwxXDE2MlwxXDE0MVwxXDE0NVwxXDE2M1wxXHVmZmZmXDFcMTU0XDFcMTcyXDFcMTUxXDJcMTcyXDFcMTQxXDFcdWZmZmZcMVwxNjdcMVwxNDFcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDE3MlwxXDE2NVwxXDE2NFwxXDE1N1wxXDE0NlwxXDE2NVwxXDE3MlwxXDE1MFwxXDE0NVwxXHVmZmZmXDFcMTcyXDFcMTYyXDFcMTYzXDFcMTY3XDFcdWZmZmZcMVwxNDNcMVwxNDVcMVwxNzJcMVwxNTBcMVwxNjJcMVwxNjRcMVwxNTZcMVwxNzJcMVwxNTFcMVwxNTRcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDE3MlwxXHVmZmZmXDFcMTYyXDFcMTQxXDFcMTQ3XDFcMTY0XDFcMTQ2XDFcMTcyXDFcdWZmZmZcMVwxNjRcMVwxNjJcMVwxNDRcMVwxNTFcMVwxNTRcMVx1ZmZmZlwyXDE3MlwxXHVmZmZmXDFcMTU2XDFcMTYzXDFcMTUxXDFcMTA2XDFcMTcyXDFcMTQ3XDFcdWZmZmZcMVwxNzJcMVwxNTdcMVwxNzJcMVwxNDNcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcMTcxXDFcMTU2XDFcMTQxXDJcdWZmZmZcMVwxNDRcMVwxNjJcMVwxNDVcMVwxNjNcMVwxNzJcMVx1ZmZmZlwxXDE1MVwxXDE1N1wyXDE0NVwxXDE2NFwyXHVmZmZmXDJcMTcyXDJcMTU3XDFcdWZmZmZcMVwxNzFcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcMTQ1XDFcMTQ3XDFcMTcyXDFcMTY0XDFcMTU0XDFcMTcyXDFcMTQ0XDJcMTcyXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE1M1wxXDc1XDFcMTYyXDFcMTcyXDJcdWZmZmZcMVwxNTZcMVwxNDNcMVwxNzJcMVwxNTFcMVwxNTdcMVwxMjNcMVx1ZmZmZlwxXDE0MVwxXDE3MlwxXHVmZmZmXDFcMTcyXDJcdWZmZmZcMVwxNDdcMVwxNDVcMVx1ZmZmZlwxXDExM1wxXDE0MVwxXDE1N1wxXHVmZmZmXDFcMTcyXDFcMTY1XDFcdWZmZmZcMVwxNzJcMVwxNDZcMVwxNjRcMVwxNTZcMVwxNTRcMlx1ZmZmZlwxXDEyM1wxXDEwNFwxXDE0NVwxXDE3MVwxXDE0M1wxXHVmZmZmXDFcMTYzXDFcMTQ1XDFcMTcyXDFcMTYyXDFcMTUwXDFcMTcyXDFcMTY0XDFcMTQ1XDFcMTcxXDFcMTU3XDFcMTY1XDFcMTUxXDFcMTQ0XDFcdWZmZmZcMlwxNDFcMVx1ZmZmZlwxXDE2MlwxXDE0NlwxXDE2M1wxXDE2NVwxXDE2M1wxXDE1NlwxXDE3MlwxXDE2NFwxXDE1NlwxXDE0MVwxXDE1MVwxXDE3MlwxXDE2NFwxXDE1MVwxXDE0N1wxXHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTY0XDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNTZcMVwxMTFcMVwxNDdcMlwxNDVcMVwxNTFcMVwxNTZcMVwxNDdcMVwxNDRcMVwxNzFcMVwxNjJcMVwxNDdcMVwxNjRcMVwxNDdcMlw3NVwyXDE3MlwxXDE3MVwxXDE1MVwxXDc1XDRcdWZmZmZcMVwxNzJcMVwxNTdcMlx1ZmZmZlwxXDE1NlwxXDE3MlwxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2FjY2VwdFMgPQotICAgICAgICAiXDMyXHVmZmZmXDFcNjBcMVw2MVw1XHVmZmZmXDFcMTAwXDFcMTAxXDFcMTAyXDFcMTAzXDFcMTA0XDFcMTA1XDFcMTA2XDFcMTA3XDExXHVmZmZmXDFcMTQ2XDJcMTQ3XDFcMTUyXDFcMTUzXDFcdWZmZmZcMVwyM1wxXDFcMVwyXDFcMTQwXDFcM1wxXDEzNFwxXDRcMVwzNVwxXDI2XDFcNVwxXDIwXDFcMzZcMVwyN1wxXDZcMVwzMVwxXDMwXDFcN1wxXDE1MFwxXDE1MVwxXDMyXDFcMTBcMVwzM1wxXHVmZmZmXDFcMzRcMVwxNVwxXDE2XDFcMjRcMVwxN1wxXHVmZmZmXDFcMzdcMVwyNVwxXDEzN1wxXDEzM1wxXHVmZmZmXDFcMTQ2XDI0XHVmZmZmXDFcNjBcMVw2MVwxMVx1ZmZmZlwxXDEwMFwxXDEwMVwxXDEwMlwxXDEwM1wxXDEwNFwxXDEwNVwxXDEwNlwxXDEwN1wxXHVmZmZmXDFcMTM2XDFcMTE1XDZcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxXDE0NFwxXDE0NVwxXDE0N1wxXDE1MlwxXDEzXDFcMTFcMVwxNFwxXDEyXDFcMjFcMVwyMlwxNFx1ZmZmZlwxXDExMlwyNFx1ZmZmZlwxXDEyMVwxXDExMVw1XHVmZmZmXDFcMTM1XDFcdWZmZmZcMVw0MFwxXDE0MVwxNFx1ZmZmZlwxXDExN1w2XHVmZmZmXDFcNTRcNVx1ZmZmZlwxXDEyN1wxMVx1ZmZmZlwxXDEyMlw0XHVmZmZmXDFcMTEzXDE0XHVmZmZmXDFcNTFcMTBcdWZmZmZcMVwxNDJcNVx1ZmZmZlwxXDExNlwyXHVmZmZmXDFcMTIzXDZcdWZmZmZcMVw0NVw0XHVmZmZmXDFcNDZcMVx1ZmZmZlwxXDcwXDNcdWZmZmZcMVw1MlwxXDUzXDVcdWZmZmZcMVwxMjVcNVx1ZmZmZlwxXDEzMlwxXDEyMFw0XHVmZmZmXDFcNDJcMVx1ZmZmZlwxXDExNFwxXHVmZmZmXDFcNDNcMTFcdWZmZmZcMVwxMjRcMVx1ZmZmZlwxXDY1XDRcdWZmZmZcMVwxMjZcMVw0MVw2XHVmZmZmXDFcMTMwXDJcdWZmZmZcMVw1NVwxXHVmZmZmXDFcNTdcMVw2M1wyXHVmZmZmXDFcNzJcM1x1ZmZmZlwxXDc1XDJcdWZmZmZcMVw2Mlw1XHVmZmZmXDFcNTBcMVw1Nlw1XHVmZmZmXDFcNDRcMTVcdWZmZmZcMVwxMTBcMlx1ZmZmZlwxXDQ3XDE3XHVmZmZmXDFcMTMxXDRcdWZmZmZcMVw3M1wyNlx1ZmZmZlwxXDc3XDFcNjdcMVw2NlwxXDc0XDJcdWZmZmZcMVw3NlwxXDY0XDJcdWZmZmZcMVw3MSI7CisgICAgICAgICJcMzJcdWZmZmZcMVw2MVwxXDYyXDVcdWZmZmZcMVwxMDFcMVwxMDJcMVwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMVwxMDdcMVwxMTBcMTFcdWZmZmZcMVwxNDdcMlwxNTBcMVwxNTNcMVwxNTRcMVx1ZmZmZlwxXDIzXDFcMVwxXDJcMVwxNDFcMVwzXDFcMTM1XDFcNFwxXDM1XDFcMjZcMVw1XDFcMjBcMVwzNlwxXDI3XDFcNlwxXDMxXDFcMzBcMVw3XDFcMTUxXDFcMTUyXDFcMzJcMVwxMFwxXDMzXDFcdWZmZmZcMVwzNFwxXDE1XDFcMTZcMVwyNFwxXDE3XDFcdWZmZmZcMVwzN1wxXDI1XDFcMTQwXDFcMTM0XDFcdWZmZmZcMVwxNDdcMjRcdWZmZmZcMVw2MVwxXDYyXDExXHVmZmZmXDFcMTAxXDFcMTAyXDFcMTAzXDFcMTA0XDFcMTA1XDFcMTA2XDFcMTA3XDFcMTEwXDFcdWZmZmZcMVwxMzdcMVwxMTZcNlx1ZmZmZlwxXDE0NFwxXHVmZmZmXDFcMTQ1XDFcMTQ2XDFcMTUwXDFcMTUzXDFcMTNcMVwxMVwxXDE0XDFcMTJcMVwyMVwxXDIyXDE0XHVmZmZmXDFcMTEzXDI0XHVmZmZmXDFcMTIyXDFcMTEyXDVcdWZmZmZcMVwxMzZcMVx1ZmZmZlwxXDQwXDFcMTQyXDE0XHVmZmZmXDFcMTIwXDZcdWZmZmZcMVw1NVw1XHVmZmZmXDFcMTMwXDExXHVmZmZmXDFcMTIzXDRcdWZmZmZcMVwxMTRcMTRcdWZmZmZcMVw1MVwyXHVmZmZmXDFcNTJcNlx1ZmZmZlwxXDE0M1w1XHVmZmZmXDFcMTE3XDJcdWZmZmZcMVwxMjRcNlx1ZmZmZlwxXDQ1XDRcdWZmZmZcMVw0NlwxXHVmZmZmXDFcNzFcM1x1ZmZmZlwxXDUzXDFcNTRcNVx1ZmZmZlwxXDEyNlw1XHVmZmZmXDFcMTMzXDFcMTIxXDRcdWZmZmZcMVw0MlwxXHVmZmZmXDFcMTE1XDFcdWZmZmZcMVw0M1wxMVx1ZmZmZlwxXDEyNVwxXHVmZmZmXDFcNjZcNFx1ZmZmZlwxXDEyN1wxXDQxXDZcdWZmZmZcMVwxMzFcMlx1ZmZmZlwxXDU2XDFcdWZmZmZcMVw2MFwxXDY0XDJcdWZmZmZcMVw3M1wzXHVmZmZmXDFcNzZcMlx1ZmZmZlwxXDYzXDVcdWZmZmZcMVw1MFwxXDU3XDVcdWZmZmZcMVw0NFwxNVx1ZmZmZlwxXDExMVwyXHVmZmZmXDFcNDdcMTdcdWZmZmZcMVwxMzJcNFx1ZmZmZlwxXDc0XDI2XHVmZmZmXDFcMTAwXDFcNzBcMVw2N1wxXDc1XDJcdWZmZmZcMVw3N1wxXDY1XDJcdWZmZmZcMVw3MiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9zcGVjaWFsUyA9Ci0gICAgICAgICJcMVwwXHUwMWIwXHVmZmZmfT4iOworICAgICAgICAiXDFcMFx1MDFiMVx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBMjFfdHJhbnNpdGlvblMgPSB7CiAgICAgICAgICAgICAiXDExXDY2XDJcNjVcMlw2NlwxXDY1XDIyXDY2XDFcNjVcMVwxMVwxXDYzXDFcNDdcMVw2MlwxXDEwXDFcM1wxXDY0XDFcNDNcMVw0NFwxXDZcMVw0XDFcNDVcMVw1XDFcMTRcMVw3XDFcNTdcMTFcNjBcMVw1MlwxXDQxXDFcMTNcMVwxXDFcMTJcMVwxNVwxXDQyXDFcNjJcMVwzMFwxXDI3XDJcNjJcMVwyNlwxXDI1XDFcMjNcMTVcNjJcMVwyNFw0XDYyXDFcNTBcMVw2NlwxXDQ2XDFcNjFcMVw2MlwxXDY2XDFcNTFcMVw2MlwxXDUzXDFcNDBcMVwxN1wxXDIyXDJcNjJcMVwyMVwxXDYyXDFcMzZcMVwzNVwxXDM3XDFcNTVcMVw2MlwxXDMxXDFcNjJcMVw1NlwxXDIwXDFcMzRcMVw2MlwxXDE2XDFcNTRcM1w2MlwxXDMyXDFcMlwxXDMzXHVmZjgyXDY2IiwKICAgICAgICAgICAgICJcMVw2N1wxXDcwIiwKQEAgLTM5OTYsMTk1ICs0MDQwLDE5NSBAQAogICAgICAgICAgICAgIlwxXHUwMGY2IiwKICAgICAgICAgICAgICJcMVx1MDBmNyIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDBmOVwxXHUwMGZhIiwKLSAgICAgICAgICAgICJcMVx1MDBmYiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMlwxMzJcMVx1MDBmOVwxXHUwMGZhXDZcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAogICAgICAgICAgICAgIlwxXHUwMGZjIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMGZkIiwKICAgICAgICAgICAgICJcMVx1MDBmZSIsCiAgICAgICAgICAgICAiXDFcdTAwZmYiLAogICAgICAgICAgICAgIlwxXHUwMTAwIiwKKyAgICAgICAgICAgICJcMVx1MDEwMSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAotICAgICAgICAgICAgIlwxXHUwMTAyIiwKICAgICAgICAgICAgICJcMVx1MDEwMyIsCiAgICAgICAgICAgICAiXDFcdTAxMDQiLAogICAgICAgICAgICAgIlwxXHUwMTA1IiwKICAgICAgICAgICAgICJcMVx1MDEwNiIsCisgICAgICAgICAgICAiXDFcdTAxMDciLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxMDgiLAogICAgICAgICAgICAgIlwxXHUwMTA5IiwKKyAgICAgICAgICAgICJcMVx1MDEwYSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAotICAgICAgICAgICAgIlwxXHUwMTBiIiwKLSAgICAgICAgICAgICJcMVx1MDEwY1wxNlx1ZmZmZlwxXHUwMTBkIiwKLSAgICAgICAgICAgICJcMVx1MDEwZSIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEwYyIsCisgICAgICAgICAgICAiXDFcdTAxMGRcMTZcdWZmZmZcMVx1MDEwZSIsCiAgICAgICAgICAgICAiXDFcdTAxMGYiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxMTAiLAorICAgICAgICAgICAgIlwxXHUwMTExIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAotICAgICAgICAgICAgIlwxXHUwMTEyIiwKICAgICAgICAgICAgICJcMVx1MDExMyIsCiAgICAgICAgICAgICAiXDFcdTAxMTQiLAogICAgICAgICAgICAgIlwxXHUwMTE1IiwKKyAgICAgICAgICAgICJcMVx1MDExNiIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDExOFw1M1x1ZmZmZlwxXHUwMTE3IiwKLSAgICAgICAgICAgICJcMVx1MDExOSIsCisgICAgICAgICAgICAiXDFcdTAxMTlcNTNcdWZmZmZcMVx1MDExOCIsCiAgICAgICAgICAgICAiXDFcdTAxMWEiLAogICAgICAgICAgICAgIlwxXHUwMTFiIiwKKyAgICAgICAgICAgICJcMVx1MDExYyIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxMWUiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxMWYiLAogICAgICAgICAgICAgIlwxXHUwMTIwIiwKICAgICAgICAgICAgICJcMVx1MDEyMSIsCiAgICAgICAgICAgICAiXDFcdTAxMjIiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxMjQiLAogICAgICAgICAgICAgIlwxXHUwMTI1IiwKICAgICAgICAgICAgICJcMVx1MDEyNiIsCiAgICAgICAgICAgICAiXDFcdTAxMjciLAogICAgICAgICAgICAgIlwxXHUwMTI4IiwKKyAgICAgICAgICAgICJcMVx1MDEyOSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDEyYiIsCiAgICAgICAgICAgICAiXDFcdTAxMmMiLAogICAgICAgICAgICAgIlwxXHUwMTJkIiwKICAgICAgICAgICAgICJcMVx1MDEyZSIsCisgICAgICAgICAgICAiXDFcdTAxMmYiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTMxIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxMzIiLAorICAgICAgICAgICAgIlwxXHUwMTMzIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAotICAgICAgICAgICAgIlwxXHUwMTM0IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTM1IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTM2IiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTM3IiwKICAgICAgICAgICAgICJcMVx1MDEzOCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTM5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxM2EiLAogICAgICAgICAgICAgIlwxXHUwMTNiIiwKICAgICAgICAgICAgICJcMVx1MDEzYyIsCisgICAgICAgICAgICAiXDFcdTAxM2QiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDEzZlw1M1x1ZmZmZlwxXHUwMTNlIiwKLSAgICAgICAgICAgICJcMVx1MDE0MCIsCisgICAgICAgICAgICAiXDFcdTAxNDBcNTNcdWZmZmZcMVx1MDEzZiIsCiAgICAgICAgICAgICAiXDFcdTAxNDEiLAogICAgICAgICAgICAgIlwxXHUwMTQyIiwKICAgICAgICAgICAgICJcMVx1MDE0MyIsCisgICAgICAgICAgICAiXDFcdTAxNDQiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxNDYiLAogICAgICAgICAgICAgIlwxXHUwMTQ3IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTQ4IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTQ5IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTRhIiwKLSAgICAgICAgICAgICJcMVx1MDE0YiIsCi0gICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDE0ZCIsCi0gICAgICAgICAgICAiXDFcdTAxNGUiLAotICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxNTAiLAotICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTUzIiwKKyAgICAgICAgICAgICJcMVx1MDE0YiIsCisgICAgICAgICAgICAiXDFcdTAxNGMiLAorICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCisgICAgICAgICAgICAiXDFcdTAxNGUiLAorICAgICAgICAgICAgIlwxXHUwMTRmIiwKKyAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAorICAgICAgICAgICAgIlwxXHUwMTUxIiwKKyAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAorICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE1NCIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE1NSIsCiAgICAgICAgICAgICAiXDFcdTAxNTYiLAotICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlw1XDEzMlwxXHUwMTU4XDVcMTMyXDFcdTAxNTdcMTZcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAorICAgICAgICAgICAgIlwxXHUwMTU3IiwKKyAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcNVwxMzJcMVx1MDE1OVw1XDEzMlwxXHUwMTU4XDE2XDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxNWEiLAogICAgICAgICAgICAgIlwxXHUwMTViIiwKKyAgICAgICAgICAgICJcMVx1MDE1YyIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDE1ZCIsCiAgICAgICAgICAgICAiXDFcdTAxNWUiLAotICAgICAgICAgICAgIlwxXHUwMTYwXDE1XHVmZmZmXDFcdTAxNWYiLAorICAgICAgICAgICAgIlwxXHUwMTVmIiwKKyAgICAgICAgICAgICJcMVx1MDE2MVwxNVx1ZmZmZlwxXHUwMTYwIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTYxIiwKKyAgICAgICAgICAgICJcMVx1MDE2MiIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTY0IiwKICAgICAgICAgICAgICJcMVx1MDE2NSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2NiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2NyIsCiAgICAgICAgICAgICAiXDFcdTAxNjgiLAorICAgICAgICAgICAgIlwxXHUwMTY5IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxNmEiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNmIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNmMiLAogICAgICAgICAgICAgIlwxXHUwMTZkIiwKICAgICAgICAgICAgICJcMVx1MDE2ZSIsCiAgICAgICAgICAgICAiXDFcdTAxNmYiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE3MCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTcxIiwKICAgICAgICAgICAgICJcMVx1MDE3MiIsCiAgICAgICAgICAgICAiXDFcdTAxNzMiLAogICAgICAgICAgICAgIlwxXHUwMTc0IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTc1IiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTc2IiwKKyAgICAgICAgICAgICJcMVx1MDE3NyIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDE3OCIsCiAgICAgICAgICAgICAiXDFcdTAxNzkiLAorICAgICAgICAgICAgIlwxXHUwMTdhIiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAotICAgICAgICAgICAgIlwxXHUwMTdiIiwKICAgICAgICAgICAgICJcMVx1MDE3YyIsCiAgICAgICAgICAgICAiXDFcdTAxN2QiLAogICAgICAgICAgICAgIlwxXHUwMTdlIiwKICAgICAgICAgICAgICJcMVx1MDE3ZiIsCiAgICAgICAgICAgICAiXDFcdTAxODAiLAogICAgICAgICAgICAgIlwxXHUwMTgxIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTgyIiwKLSAgICAgICAgICAgICJcMVx1MDE4MyIsCiAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4MyIsCiAgICAgICAgICAgICAiXDFcdTAxODQiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxODUiLAogICAgICAgICAgICAgIlwxXHUwMTg2IiwKICAgICAgICAgICAgICJcMVx1MDE4NyIsCiAgICAgICAgICAgICAiXDFcdTAxODgiLAogICAgICAgICAgICAgIlwxXHUwMTg5IiwKKyAgICAgICAgICAgICJcMVx1MDE4YSIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDE4YiIsCiAgICAgICAgICAgICAiXDFcdTAxOGMiLAogICAgICAgICAgICAgIlwxXHUwMThkIiwKICAgICAgICAgICAgICJcMVx1MDE4ZSIsCisgICAgICAgICAgICAiXDFcdTAxOGYiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxOTAiLAogICAgICAgICAgICAgIlwxXHUwMTkxIiwKICAgICAgICAgICAgICJcMVx1MDE5MiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE5MyIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE5NCIsCiAgICAgICAgICAgICAiXDFcdTAxOTUiLAogICAgICAgICAgICAgIlwxXHUwMTk2IiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTk3IiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTk4IiwKICAgICAgICAgICAgICJcMVx1MDE5OSIsCiAgICAgICAgICAgICAiXDFcdTAxOWEiLApAQCAtNDIwMSwyMCArNDI0NSwyMSBAQAogICAgICAgICAgICAgIlwxXHUwMWE1IiwKICAgICAgICAgICAgICJcMVx1MDFhNiIsCiAgICAgICAgICAgICAiXDFcdTAxYTciLAorICAgICAgICAgICAgIlwxXHUwMWE4IiwKICAgICAgICAgICAgICJcMVwxMzJcMTNcdWZmZmZcMTJcMTMyXDdcdWZmZmZcMzJcMTMyXDRcdWZmZmZcMVwxMzJcMVx1ZmZmZlwzMlwxMzIiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCi0gICAgICAgICAgICAiXDFcdTAxYWEiLAogICAgICAgICAgICAgIlwxXHUwMWFiIiwKICAgICAgICAgICAgICJcMVx1MDFhYyIsCisgICAgICAgICAgICAiXDFcdTAxYWQiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcMTMyXDEzXHVmZmZmXDEyXDEzMlw3XHVmZmZmXDMyXDEzMlw0XHVmZmZmXDFcMTMyXDFcdWZmZmZcMzJcMTMyIiwKLSAgICAgICAgICAgICJcMVx1MDFhZSIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMWFmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYjAiLAogICAgICAgICAgICAgIlwxXDEzMlwxM1x1ZmZmZlwxMlwxMzJcN1x1ZmZmZlwzMlwxMzJcNFx1ZmZmZlwxXDEzMlwxXHVmZmZmXDMyXDEzMiIsCiAgICAgICAgICAgICAiIgogICAgIH07CkBAIC00MjQ5LDcgKzQyOTQsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMjFfdHJhbnNpdGlvbjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIxOjE6IFRva2VucyA6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApOyI7CisgICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0xQYXJzZXIuamF2YQppbmRleCBmYTM5NjM5Li4yNDlkYzdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTFBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMUGFyc2VyLmphdmEKQEAgLTEsMyArMSwxOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTIzLDcgKzM4LDcgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQogcHVibGljIGNsYXNzIEludGVybmFsU3RyYXRlZ3lEU0xQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlciB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJSVUxFX0lEIiwgIlJVTEVfSEVYIiwgIlJVTEVfSU5UIiwgIlJVTEVfREVDSU1BTCIsICJSVUxFX1NUUklORyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiwgIlJVTEVfV1MiLCAiUlVMRV9BTllfT1RIRVIiLCAiJz0nIiwgIid8fCciLCAiJyYmJyIsICInKz0nIiwgIictPSciLCAiJyo9JyIsICInLz0nIiwgIiclPSciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIic+PSciLCAiJz4nIiwgIic8JyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIictJyIsICInKiciLCAiJyoqJyIsICInLyciLCAiJyUnIiwgIichJyIsICInKysnIiwgIictLSciLCAiJy4nIiwgIid2YWwnIiwgIidleHRlbmRzJyIsICInc3RhdGljJyIsICInaW1wb3J0JyIsICInZXh0ZW5zaW9uJyIsICInc3VwZXInIiwgIidmYWxzZSciLCAiJ0hvcml6b250YWwnIiwgIidWZXJ0aWNhbCciLCAiJ0dyaWQnIiwgIidGb3JtMiciLCAiJ0Zvcm0zJyIsICInQ3NzJyIsICInRm9yd2FyZCciLCAiJ0JhY2t3YXJkJyIsICIncGFja2FnZSciLCAiJ3snIiwgIid9JyIsICInc3RyYXRlZ3knIiwgIid0YXJnZXRzJyIsICInbGF5b3V0aW5nU3RyYXRlZ3knIiwgIidsYXlvdXQ9JyIsICInZm9jdXNpbmdTdHJhdGVneSciLCAiJ2Vjdmlld0ZvY3VzaW5nSWQ9JyIsICInZm9jdXM9JyIsICIna2V5U3Ryb2tlRGVmaW5pdGlvbiciLCAiJ2tleUNvZGU9JyIsICInbW9kaWZpZXJLZXlzJyIsICInZm9jdXNpbmdFbmhhbmNlciciLCAiJ2RlZmF1bHQnIiwgIidkZWZhdWx0TGF5b3V0aW5nPSciLCAiJ2RlZmF1bHRGb2N1c2luZz0nIiwgIic7JyIsICInQCciLCAiJygnIiwgIicpJyIsICInLCciLCAiJ10nIiwgIicjJyIsICInWyciLCAiJ2luc3RhbmNlb2YnIiwgIidhcyciLCAiJ2lmJyIsICInZWxzZSciLCAiJ3N3aXRjaCciLCAiJzonIiwgIidjYXNlJyIsICInZm9yJyIsICInd2hpbGUnIiwgIidkbyciLCAiJ25ldyciLCAiJ251bGwnIiwgIid0eXBlb2YnIiwgIid0aHJvdyciLCAiJ3JldHVybiciLCAiJ3RyeSciLCAiJ2ZpbmFsbHknIiwgIidzeW5jaHJvbml6ZWQnIiwgIidjYXRjaCciLCAiJz8nIiwgIicmJyIsICInbnMnIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJ3ZhciciLCAiJ3RydWUnIgorICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9JTlQiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICInPSciLCAiJ3x8JyIsICInJiYnIiwgIicrPSciLCAiJy09JyIsICInKj0nIiwgIicvPSciLCAiJyU9JyIsICInPT0nIiwgIichPSciLCAiJz09PSciLCAiJyE9PSciLCAiJz49JyIsICInPiciLCAiJzwnIiwgIictPiciLCAiJy4uPCciLCAiJy4uJyIsICInPT4nIiwgIic8PiciLCAiJz86JyIsICInKyciLCAiJy0nIiwgIicqJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInLiciLCAiJ3ZhbCciLCAiJ2V4dGVuZHMnIiwgIidzdGF0aWMnIiwgIidpbXBvcnQnIiwgIidleHRlbnNpb24nIiwgIidzdXBlciciLCAiJ2ZhbHNlJyIsICInSG9yaXpvbnRhbCciLCAiJ1ZlcnRpY2FsJyIsICInR3JpZCciLCAiJ0Zvcm0nIiwgIidGb3JtMiciLCAiJ0Zvcm0zJyIsICInQ3NzJyIsICInRm9yd2FyZCciLCAiJ0JhY2t3YXJkJyIsICIncGFja2FnZSciLCAiJ3snIiwgIid9JyIsICInc3RyYXRlZ3knIiwgIid0YXJnZXRzJyIsICInbGF5b3V0aW5nU3RyYXRlZ3knIiwgIidsYXlvdXQ9JyIsICInZm9jdXNpbmdTdHJhdGVneSciLCAiJ2Vjdmlld0ZvY3VzaW5nSWQ9JyIsICInZm9jdXM9JyIsICIna2V5U3Ryb2tlRGVmaW5pdGlvbiciLCAiJ2tleUNvZGU9JyIsICInbW9kaWZpZXJLZXlzJyIsICInZm9jdXNpbmdFbmhhbmNlciciLCAiJ2RlZmF1bHQnIiwgIidkZWZhdWx0TGF5b3V0aW5nPSciLCAiJ2RlZmF1bHRGb2N1c2luZz0nIiwgIic7JyIsICInQCciLCAiJygnIiwgIicpJyIsICInLCciLCAiJ10nIiwgIicjJyIsICInWyciLCAiJ2luc3RhbmNlb2YnIiwgIidhcyciLCAiJ2lmJyIsICInZWxzZSciLCAiJ3N3aXRjaCciLCAiJzonIiwgIidjYXNlJyIsICInZm9yJyIsICInd2hpbGUnIiwgIidkbyciLCAiJ25ldyciLCAiJ251bGwnIiwgIid0eXBlb2YnIiwgIid0aHJvdyciLCAiJ3JldHVybiciLCAiJ3RyeSciLCAiJ2ZpbmFsbHknIiwgIidzeW5jaHJvbml6ZWQnIiwgIidjYXRjaCciLCAiJz8nIiwgIicmJyIsICInbnMnIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJ3ZhciciLCAiJ3RydWUnIgogICAgIH07CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKQEAgLTExNCw2ICsxMjksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMT0xMTE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEwPTExMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKQEAgLTg0MDUsMTAgKzg0MjEsMTAgQEAKICAgICAgICAgICAgIGludCBhbHQ4PTI7CiAgICAgICAgICAgICBpbnQgTEE4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE4XzA9PTc3KSApIHsKKyAgICAgICAgICAgIGlmICggKExBOF8wPT03OCkgKSB7CiAgICAgICAgICAgICAgICAgYWx0OD0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE4XzA+PVJVTEVfSUQgJiYgTEE4XzA8PVJVTEVfU1RSSU5HKXx8TEE4XzA9PTI3fHwoTEE4XzA+PTM0ICYmIExBOF8wPD0zNSl8fExBOF8wPT00MHx8KExBOF8wPj00NSAmJiBMQThfMDw9NTApfHxMQThfMD09NjB8fExBOF8wPT03OHx8KExBOF8wPj04MiAmJiBMQThfMDw9ODMpfHxMQThfMD09ODZ8fExBOF8wPT04OHx8KExBOF8wPj05MSAmJiBMQThfMDw9OTkpfHxMQThfMD09MTAxfHxMQThfMD09MTEwKSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBOF8wPj1SVUxFX0lEICYmIExBOF8wPD1SVUxFX1NUUklORyl8fExBOF8wPT0yN3x8KExBOF8wPj0zNCAmJiBMQThfMDw9MzUpfHxMQThfMD09NDB8fChMQThfMD49NDUgJiYgTEE4XzA8PTUwKXx8TEE4XzA9PTYxfHxMQThfMD09Nzl8fChMQThfMD49ODMgJiYgTEE4XzA8PTg0KXx8TEE4XzA9PTg3fHxMQThfMD09ODl8fChMQThfMD49OTIgJiYgTEE4XzA8PTEwMCl8fExBOF8wPT0xMDJ8fExBOF8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDg9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtODQ5Niw3ICs4NTEyLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaW50IExBOV8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTlfMT09RU9GfHwoTEE5XzE+PVJVTEVfSUQgJiYgTEE5XzE8PVJVTEVfU1RSSU5HKXx8KExBOV8xPj0xNCAmJiBMQTlfMTw9NTApfHwoTEE5XzE+PTYwICYmIExBOV8xPD02MSl8fExBOV8xPT03M3x8TEE5XzE9PTc2fHwoTEE5XzE+PTc4ICYmIExBOV8xPD0xMDIpfHwoTEE5XzE+PTEwNiAmJiBMQTlfMTw9MTA3KXx8KExBOV8xPj0xMDkgJiYgTEE5XzE8PTExMCkpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBOV8xPT1FT0Z8fChMQTlfMT49UlVMRV9JRCAmJiBMQTlfMTw9UlVMRV9TVFJJTkcpfHwoTEE5XzE+PTE0ICYmIExBOV8xPD01MCl8fChMQTlfMT49NjEgJiYgTEE5XzE8PTYyKXx8TEE5XzE9PTc0fHxMQTlfMT09Nzd8fChMQTlfMT49NzkgJiYgTEE5XzE8PTEwMyl8fChMQTlfMT49MTA3ICYmIExBOV8xPD0xMDgpfHwoTEE5XzE+PTExMCAmJiBMQTlfMTw9MTExKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfMT09MTMpICkgewpAQCAtODUxNSwxMiArODUzMSwxMiBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpbnQgTEE5XzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOV8yPT0xMykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfMj09RU9GfHwoTEE5XzI+PVJVTEVfSUQgJiYgTEE5XzI8PVJVTEVfU1RSSU5HKXx8KExBOV8yPj0xNCAmJiBMQTlfMjw9NTApfHwoTEE5XzI+PTYwICYmIExBOV8yPD02MSl8fExBOV8yPT03M3x8TEE5XzI9PTc2fHwoTEE5XzI+PTc4ICYmIExBOV8yPD0xMDIpfHwoTEE5XzI+PTEwNiAmJiBMQTlfMjw9MTA3KXx8KExBOV8yPj0xMDkgJiYgTEE5XzI8PTExMCkpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBOV8yPT1FT0Z8fChMQTlfMj49UlVMRV9JRCAmJiBMQTlfMjw9UlVMRV9TVFJJTkcpfHwoTEE5XzI+PTE0ICYmIExBOV8yPD01MCl8fChMQTlfMj49NjEgJiYgTEE5XzI8PTYyKXx8TEE5XzI9PTc0fHxMQTlfMj09Nzd8fChMQTlfMj49NzkgJiYgTEE5XzI8PTEwMyl8fChMQTlfMj49MTA3ICYmIExBOV8yPD0xMDgpfHwoTEE5XzI+PTExMCAmJiBMQTlfMjw9MTExKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk9MjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfMj09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQpAQCAtODUzNCwxMiArODU1MCwxMiBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpbnQgTEE5XzMgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOV8zPT1FT0Z8fChMQTlfMz49UlVMRV9JRCAmJiBMQTlfMzw9UlVMRV9TVFJJTkcpfHwoTEE5XzM+PTE0ICYmIExBOV8zPD01MCl8fChMQTlfMz49NjAgJiYgTEE5XzM8PTYxKXx8TEE5XzM9PTczfHxMQTlfMz09NzZ8fChMQTlfMz49NzggJiYgTEE5XzM8PTEwMil8fChMQTlfMz49MTA2ICYmIExBOV8zPD0xMDcpfHwoTEE5XzM+PTEwOSAmJiBMQTlfMzw9MTEwKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDk9MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfMz09MTMpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBOV8zPT0xMykgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfMz09RU9GfHwoTEE5XzM+PVJVTEVfSUQgJiYgTEE5XzM8PVJVTEVfU1RSSU5HKXx8KExBOV8zPj0xNCAmJiBMQTlfMzw9NTApfHwoTEE5XzM+PTYxICYmIExBOV8zPD02Mil8fExBOV8zPT03NHx8TEE5XzM9PTc3fHwoTEE5XzM+PTc5ICYmIExBOV8zPD0xMDMpfHwoTEE5XzM+PTEwNyAmJiBMQTlfMzw9MTA4KXx8KExBOV8zPj0xMTAgJiYgTEE5XzM8PTExMSkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQpAQCAtODU1MywxMiArODU2OSwxMiBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpbnQgTEE5XzQgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOV80PT0xMykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfND09RU9GfHwoTEE5XzQ+PVJVTEVfSUQgJiYgTEE5XzQ8PVJVTEVfU1RSSU5HKXx8KExBOV80Pj0xNCAmJiBMQTlfNDw9NTApfHwoTEE5XzQ+PTYwICYmIExBOV80PD02MSl8fExBOV80PT03M3x8TEE5XzQ9PTc2fHwoTEE5XzQ+PTc4ICYmIExBOV80PD0xMDIpfHwoTEE5XzQ+PTEwNiAmJiBMQTlfNDw9MTA3KXx8KExBOV80Pj0xMDkgJiYgTEE5XzQ8PTExMCkpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBOV80PT1FT0Z8fChMQTlfND49UlVMRV9JRCAmJiBMQTlfNDw9UlVMRV9TVFJJTkcpfHwoTEE5XzQ+PTE0ICYmIExBOV80PD01MCl8fChMQTlfND49NjEgJiYgTEE5XzQ8PTYyKXx8TEE5XzQ9PTc0fHxMQTlfND09Nzd8fChMQTlfND49NzkgJiYgTEE5XzQ8PTEwMyl8fChMQTlfND49MTA3ICYmIExBOV80PD0xMDgpfHwoTEE5XzQ+PTExMCAmJiBMQTlfNDw9MTExKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk9MjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfND09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQpAQCAtODU3MiwxMiArODU4OCwxMiBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpbnQgTEE5XzUgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBOV81PT1FT0Z8fChMQTlfNT49UlVMRV9JRCAmJiBMQTlfNTw9UlVMRV9TVFJJTkcpfHwoTEE5XzU+PTE0ICYmIExBOV81PD01MCl8fChMQTlfNT49NjAgJiYgTEE5XzU8PTYxKXx8TEE5XzU9PTczfHxMQTlfNT09NzZ8fChMQTlfNT49NzggJiYgTEE5XzU8PTEwMil8fChMQTlfNT49MTA2ICYmIExBOV81PD0xMDcpfHwoTEE5XzU+PTEwOSAmJiBMQTlfNTw9MTEwKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsdDk9MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfNT09MTMpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBOV81PT0xMykgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTlfNT09RU9GfHwoTEE5XzU+PVJVTEVfSUQgJiYgTEE5XzU8PVJVTEVfU1RSSU5HKXx8KExBOV81Pj0xNCAmJiBMQTlfNTw9NTApfHwoTEE5XzU+PTYxICYmIExBOV81PD02Mil8fExBOV81PT03NHx8TEE5XzU9PTc3fHwoTEE5XzU+PTc5ICYmIExBOV81PD0xMDMpfHwoTEE5XzU+PTEwNyAmJiBMQTlfNTw9MTA4KXx8KExBOV81Pj0xMTAgJiYgTEE5XzU8PTExMSkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQpAQCAtODU5NywxMyArODYxMywxMiBAQAogICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICBjYXNlIDgyOgorICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgIGNhc2UgNzk6CiAgICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgIGNhc2UgODg6Ci0gICAgICAgICAgICBjYXNlIDkxOgorICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgIGNhc2UgODc6CisgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICBjYXNlIDk0OgpAQCAtODYxMiw4ICs4NjI3LDkgQEAKICAgICAgICAgICAgIGNhc2UgOTc6CiAgICAgICAgICAgICBjYXNlIDk4OgogICAgICAgICAgICAgY2FzZSA5OToKLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgY2FzZSAxMTA6CisgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgIGNhc2UgMTAyOgorICAgICAgICAgICAgY2FzZSAxMTE6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFsdDk9MjsKICAgICAgICAgICAgICAgICB9CkBAIC05MDY5LDcgKzkwODUsNyBAQAogICAgICAgICAgICAgaW50IGFsdDEyPTI7CiAgICAgICAgICAgICBpbnQgTEExMl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTJfMD09ODQpICkgeworICAgICAgICAgICAgaWYgKCAoTEExMl8wPT04NSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MTI9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTJfMD49MjUgJiYgTEExMl8wPD0yNykpICkgewpAQCAtOTE3Nyw3ICs5MTkzLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaW50IExBMTNfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExM18yPT1FT0Z8fChMQTEzXzI+PVJVTEVfSUQgJiYgTEExM18yPD1SVUxFX1NUUklORyl8fExBMTNfMj09Mjd8fChMQTEzXzI+PTM0ICYmIExBMTNfMjw9MzUpfHxMQTEzXzI9PTQwfHwoTEExM18yPj00NSAmJiBMQTEzXzI8PTUwKXx8TEExM18yPT02MHx8TEExM18yPT03OHx8KExBMTNfMj49ODIgJiYgTEExM18yPD04Myl8fExBMTNfMj09ODZ8fExBMTNfMj09ODh8fChMQTEzXzI+PTkxICYmIExBMTNfMjw9OTkpfHxMQTEzXzI9PTEwMXx8TEExM18yPT0xMTApICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTNfMj09RU9GfHwoTEExM18yPj1SVUxFX0lEICYmIExBMTNfMjw9UlVMRV9TVFJJTkcpfHxMQTEzXzI9PTI3fHwoTEExM18yPj0zNCAmJiBMQTEzXzI8PTM1KXx8TEExM18yPT00MHx8KExBMTNfMj49NDUgJiYgTEExM18yPD01MCl8fExBMTNfMj09NjF8fExBMTNfMj09Nzl8fChMQTEzXzI+PTgzICYmIExBMTNfMjw9ODQpfHxMQTEzXzI9PTg3fHxMQTEzXzI9PTg5fHwoTEExM18yPj05MiAmJiBMQTEzXzI8PTEwMCl8fExBMTNfMj09MTAyfHxMQTEzXzI9PTExMSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExM18yPT0xMykgKSB7CkBAIC05NTUyLDcgKzk1NjgsNyBAQAogICAgICAgICAgICAgaWYgKCAoTEExNV8wPT0yNikgKSB7CiAgICAgICAgICAgICAgICAgaW50IExBMTVfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNV8xPT1FT0Z8fChMQTE1XzE+PVJVTEVfSUQgJiYgTEExNV8xPD1SVUxFX1NUUklORyl8fExBMTVfMT09Mjd8fChMQTE1XzE+PTM0ICYmIExBMTVfMTw9MzUpfHxMQTE1XzE9PTQwfHwoTEExNV8xPj00NSAmJiBMQTE1XzE8PTUwKXx8TEExNV8xPT02MHx8TEExNV8xPT03OHx8KExBMTVfMT49ODIgJiYgTEExNV8xPD04Myl8fExBMTVfMT09ODZ8fExBMTVfMT09ODh8fChMQTE1XzE+PTkxICYmIExBMTVfMTw9OTkpfHxMQTE1XzE9PTEwMXx8TEExNV8xPT0xMTApICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTVfMT09RU9GfHwoTEExNV8xPj1SVUxFX0lEICYmIExBMTVfMTw9UlVMRV9TVFJJTkcpfHxMQTE1XzE9PTI3fHwoTEExNV8xPj0zNCAmJiBMQTE1XzE8PTM1KXx8TEExNV8xPT00MHx8KExBMTVfMT49NDUgJiYgTEExNV8xPD01MCl8fExBMTVfMT09NjF8fExBMTVfMT09Nzl8fChMQTE1XzE+PTgzICYmIExBMTVfMTw9ODQpfHxMQTE1XzE9PTg3fHxMQTE1XzE9PTg5fHwoTEExNV8xPj05MiAmJiBMQTE1XzE8PTEwMCl8fExBMTVfMT09MTAyfHxMQTE1XzE9PTExMSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDE1PTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNV8xPT0yNikgKSB7CkBAIC05OTg4LDcgKzEwMDA0LDcgQEAKICAgICAgICAgICAgIGlmICggKChMQTE5XzA+PTM0ICYmIExBMTlfMDw9MzUpfHxMQTE5XzA9PTQwKSApIHsKICAgICAgICAgICAgICAgICBhbHQxOT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExOV8wPj1SVUxFX0lEICYmIExBMTlfMDw9UlVMRV9TVFJJTkcpfHxMQTE5XzA9PTI3fHwoTEExOV8wPj00NSAmJiBMQTE5XzA8PTUwKXx8TEExOV8wPT02MHx8TEExOV8wPT03OHx8KExBMTlfMD49ODIgJiYgTEExOV8wPD04Myl8fExBMTlfMD09ODZ8fExBMTlfMD09ODh8fChMQTE5XzA+PTkxICYmIExBMTlfMDw9OTkpfHxMQTE5XzA9PTEwMXx8TEExOV8wPT0xMTApICkgeworICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExOV8wPj1SVUxFX0lEICYmIExBMTlfMDw9UlVMRV9TVFJJTkcpfHxMQTE5XzA9PTI3fHwoTEExOV8wPj00NSAmJiBMQTE5XzA8PTUwKXx8TEExOV8wPT02MXx8TEExOV8wPT03OXx8KExBMTlfMD49ODMgJiYgTEExOV8wPD04NCl8fExBMTlfMD09ODd8fExBMTlfMD09ODl8fChMQTE5XzA+PTkyICYmIExBMTlfMDw9MTAwKXx8TEExOV8wPT0xMDJ8fExBMTlfMD09MTExKSApIHsKICAgICAgICAgICAgICAgICBhbHQxOT0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CkBAIC0xMDM1Niw3ICsxMDM3Miw3IEBACiAgICAgICAgICAgICBpZiAoIChMQTIzXzA9PTQzKSApIHsKICAgICAgICAgICAgICAgICBhbHQyMz0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIzXzA9PTEwNikgKSB7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMjNfMD09MTA3KSApIHsKICAgICAgICAgICAgICAgICBhbHQyMz0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CkBAIC0xMDQ0NywxMiArMTA0NjMsMTIgQEAKICAgICAgICAgICAgICAgICBhbHQyND0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA3OgorICAgICAgICAgICAgY2FzZSAxMDg6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFsdDI0PTI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDY6CisgICAgICAgICAgICBjYXNlIDEwNzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0MjQ9MzsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTA0MSwxOCArMTEwNTcsMTggQEAKICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozMDU2OjE6ICggKCBydWxlWENvbGxlY3Rpb25MaXRlcmFsICkgfCAoICggcnVsZVhDbG9zdXJlICkgKSB8ICggcnVsZVhCb29sZWFuTGl0ZXJhbCApIHwgKCBydWxlWE51bWJlckxpdGVyYWwgKSB8ICggcnVsZVhOdWxsTGl0ZXJhbCApIHwgKCBydWxlWFN0cmluZ0xpdGVyYWwgKSB8ICggcnVsZVhUeXBlTGl0ZXJhbCApICkKICAgICAgICAgICAgIGludCBhbHQyNz03OwogICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7Ci0gICAgICAgICAgICBjYXNlIDgyOgorICAgICAgICAgICAgY2FzZSA4MzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0Mjc9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDgzOgorICAgICAgICAgICAgY2FzZSA4NDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0Mjc9MjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgY2FzZSAxMTA6CisgICAgICAgICAgICBjYXNlIDExMToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0Mjc9MzsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTA2NCw3ICsxMTA4MCw3IEBACiAgICAgICAgICAgICAgICAgYWx0Mjc9NDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk1OgorICAgICAgICAgICAgY2FzZSA5NjoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0Mjc9NTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTA3NCw3ICsxMTA5MCw3IEBACiAgICAgICAgICAgICAgICAgYWx0Mjc9NjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgY2FzZSA5NzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWx0Mjc9NzsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTI4MywxNSArMTEyOTksMTUgQEAKICAgICAgICAgICAgIGludCBhbHQyOD0yOwogICAgICAgICAgICAgaW50IExBMjhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTI4XzA9PTgyKSApIHsKKyAgICAgICAgICAgIGlmICggKExBMjhfMD09ODMpICkgewogICAgICAgICAgICAgICAgIGludCBMQTI4XzEgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMjhfMT09NjApICkgewotICAgICAgICAgICAgICAgICAgICBhbHQyOD0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjhfMT09ODMpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMjhfMT09ODQpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQyOD0yOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjhfMT09NjEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyOD0xOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQogICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KQEAgLTExNDY4LDEwICsxMTQ4NCwxMCBAQAogICAgICAgICAgICAgaW50IGFsdDMwPTI7CiAgICAgICAgICAgICBpbnQgTEEzMF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMzBfMD09ODkpICkgeworICAgICAgICAgICAgaWYgKCAoTEEzMF8wPT05MCkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MzA9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMF8wPT04MCkgKSB7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMzBfMD09ODEpICkgewogICAgICAgICAgICAgICAgIGFsdDMwPTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTExNTY4LDEwICsxMTU4NCwxMCBAQAogICAgICAgICAgICAgaW50IGFsdDMxPTI7CiAgICAgICAgICAgICBpbnQgTEEzMV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMzFfMD09NDR8fExBMzFfMD09MTA5KSApIHsKKyAgICAgICAgICAgIGlmICggKExBMzFfMD09NDR8fExBMzFfMD09MTEwKSApIHsKICAgICAgICAgICAgICAgICBhbHQzMT0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEzMV8wPj1SVUxFX0lEICYmIExBMzFfMDw9UlVMRV9TVFJJTkcpfHxMQTMxXzA9PTI3fHwoTEEzMV8wPj0zNCAmJiBMQTMxXzA8PTM1KXx8TEEzMV8wPT00MHx8KExBMzFfMD49NDUgJiYgTEEzMV8wPD01MCl8fExBMzFfMD09NjB8fExBMzFfMD09Nzh8fChMQTMxXzA+PTgyICYmIExBMzFfMDw9ODMpfHxMQTMxXzA9PTg2fHxMQTMxXzA9PTg4fHwoTEEzMV8wPj05MSAmJiBMQTMxXzA8PTk5KXx8TEEzMV8wPT0xMDF8fExBMzFfMD09MTEwKSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMzFfMD49UlVMRV9JRCAmJiBMQTMxXzA8PVJVTEVfU1RSSU5HKXx8TEEzMV8wPT0yN3x8KExBMzFfMD49MzQgJiYgTEEzMV8wPD0zNSl8fExBMzFfMD09NDB8fChMQTMxXzA+PTQ1ICYmIExBMzFfMDw9NTApfHxMQTMxXzA9PTYxfHxMQTMxXzA9PTc5fHwoTEEzMV8wPj04MyAmJiBMQTMxXzA8PTg0KXx8TEEzMV8wPT04N3x8TEEzMV8wPT04OXx8KExBMzFfMD49OTIgJiYgTEEzMV8wPD0xMDApfHxMQTMxXzA9PTEwMnx8TEEzMV8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDMxPTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTExNjU2LDcgKzExNjcyLDcgQEAKICAgICAgICAgICAgIGludCBhbHQzMj0yOwogICAgICAgICAgICAgaW50IExBMzJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTMyXzA9PTEwOSkgKSB7CisgICAgICAgICAgICBpZiAoIChMQTMyXzA9PTExMCkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MzI9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMl8wPT00NCkgKSB7CkBAIC0xMTc2Myw3ICsxMTc3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMzXzA9PTMxfHxMQTMzXzA9PTc4KSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzM18wPT0zMXx8TEEzM18wPT03OSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MzM9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtMTIyNzksNyArMTIyOTUsNyBAQAogICAgICAgICAgICAgaWYgKCAoTEEzOF8wPT01MCkgKSB7CiAgICAgICAgICAgICAgICAgYWx0Mzg9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzOF8wPT0xMTApICkgeworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM4XzA9PTExMSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0Mzg9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtMTIzNjYsMTAgKzEyMzgyLDEwIEBACiAgICAgICAgICAgICBpbnQgYWx0Mzk9MjsKICAgICAgICAgICAgIGludCBMQTM5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEEzOV8wPT0xMDIpICkgeworICAgICAgICAgICAgaWYgKCAoTEEzOV8wPT0xMDMpICkgewogICAgICAgICAgICAgICAgIGFsdDM5PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMzlfMD09MTAwKSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzOV8wPT0xMDEpICkgewogICAgICAgICAgICAgICAgIGFsdDM5PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTEyNzE5LDcgKzEyNzM1LDcgQEAKICAgICAgICAgICAgIGlmICggKExBNDNfMD09UlVMRV9JRCkgKSB7CiAgICAgICAgICAgICAgICAgYWx0NDM9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0M18wPT0zMXx8TEE0M18wPT03OCkgKSB7CisgICAgICAgICAgICBlbHNlIGlmICggKExBNDNfMD09MzF8fExBNDNfMD09NzkpICkgewogICAgICAgICAgICAgICAgIGFsdDQzPTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTEyODEwLDEwICsxMjgyNiwxMCBAQAogICAgICAgICAgICAgaW50IGFsdDQ0PTI7CiAgICAgICAgICAgICBpbnQgTEE0NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNDRfMD09UlVMRV9JRHx8TEE0NF8wPT0zMXx8TEE0NF8wPT03OCkgKSB7CisgICAgICAgICAgICBpZiAoIChMQTQ0XzA9PVJVTEVfSUR8fExBNDRfMD09MzF8fExBNDRfMD09NzkpICkgewogICAgICAgICAgICAgICAgIGFsdDQ0PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBNDRfMD09MTAzKSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0NF8wPT0xMDQpICkgewogICAgICAgICAgICAgICAgIGFsdDQ0PTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTEyOTg4LDE0ICsxMzAwNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0xheW91dGluZ0VudW1fX0FsdGVybmF0aXZlcyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzQ5OToxOiBydWxlX19MYXlvdXRpbmdFbnVtX19BbHRlcm5hdGl2ZXMgOiAoICggKCAnSG9yaXpvbnRhbCcgKSApIHwgKCAoICdWZXJ0aWNhbCcgKSApIHwgKCAoICdHcmlkJyApICkgfCAoICggJ0Zvcm0yJyApICkgfCAoICggJ0Zvcm0zJyApICkgfCAoICggJ0NzcycgKSApICk7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM0OTk6MTogcnVsZV9fTGF5b3V0aW5nRW51bV9fQWx0ZXJuYXRpdmVzIDogKCAoICggJ0hvcml6b250YWwnICkgKSB8ICggKCAnVmVydGljYWwnICkgKSB8ICggKCAnR3JpZCcgKSApIHwgKCAoICdGb3JtJyApICkgfCAoICggJ0Zvcm0yJyApICkgfCAoICggJ0Zvcm0zJyApICkgfCAoICggJ0NzcycgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nRW51bV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTAzOjE6ICggKCAoICdIb3Jpem9udGFsJyApICkgfCAoICggJ1ZlcnRpY2FsJyApICkgfCAoICggJ0dyaWQnICkgKSB8ICggKCAnRm9ybTInICkgKSB8ICggKCAnRm9ybTMnICkgKSB8ICggKCAnQ3NzJyApICkgKQotICAgICAgICAgICAgaW50IGFsdDQ2PTY7CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUwMzoxOiAoICggKCAnSG9yaXpvbnRhbCcgKSApIHwgKCAoICdWZXJ0aWNhbCcgKSApIHwgKCAoICdHcmlkJyApICkgfCAoICggJ0Zvcm0nICkgKSB8ICggKCAnRm9ybTInICkgKSB8ICggKCAnRm9ybTMnICkgKSB8ICggKCAnQ3NzJyApICkgKQorICAgICAgICAgICAgaW50IGFsdDQ2PTc7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgewpAQCAtMTMwMjcsNiArMTMwNDMsMTEgQEAKICAgICAgICAgICAgICAgICBhbHQ0Nj02OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ2PTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CiAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CkBAIC0xMzExMiwyMyArMTMxMzMsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUyMjoyOiAoICggJ0Zvcm0yJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MjI6MjogKCAoICdGb3JtJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUyMjoyOiAoICggJ0Zvcm0yJyApICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MjM6MzogKCAnRm9ybTInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MjI6MjogKCAoICdGb3JtJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MjM6MzogKCAnRm9ybScgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MjQ6MzogKCAnRm9ybTInICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MjQ6NDogJ0Zvcm0yJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUyNDozOiAoICdGb3JtJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTI0OjQ6ICdGb3JtJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDU0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMzEzNywyMyArMTMxNTgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUyODoyOiAoICggJ0Zvcm0zJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1Mjg6MjogKCAoICdGb3JtMicgKSApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1Mjg6MjogKCAoICdGb3JtMycgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTI5OjM6ICggJ0Zvcm0zJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTI4OjI6ICggKCAnRm9ybTInICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUyOTozOiAoICdGb3JtMicgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTMwOjM6ICggJ0Zvcm0zJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTMwOjQ6ICdGb3JtMycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MzA6MzogKCAnRm9ybTInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MzA6NDogJ0Zvcm0yJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDU1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTMxNjIsMjMgKzEzMTgzLDQ4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA2IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MzQ6MjogKCAoICdDc3MnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUzNDoyOiAoICggJ0Zvcm0zJyApICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUzNDoyOiAoICggJ0NzcycgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTM1OjM6ICggJ0NzcycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzUzNDoyOiAoICggJ0Zvcm0zJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MzU6MzogKCAnRm9ybTMnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldENTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRGT1JNM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgCiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1MzY6MzogKCAnQ3NzJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTM2OjQ6ICdDc3MnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTM2OjM6ICggJ0Zvcm0zJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTM2OjQ6ICdGb3JtMycKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewotICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRGT1JNM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTQwOjI6ICggKCAnQ3NzJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU0MDoyOiAoICggJ0NzcycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTQxOjM6ICggJ0NzcycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Q1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU0MjozOiAoICdDc3MnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NDI6NDogJ0NzcycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw1NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTMyMDQsMjAgKzEzMjUwLDIwIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdFbnVtX19BbHRlcm5hdGl2ZXMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NDQ6MTogcnVsZV9fRm9jdXNpbmdFbnVtX19BbHRlcm5hdGl2ZXMgOiAoICggKCAnRm9yd2FyZCcgKSApIHwgKCAoICdCYWNrd2FyZCcgKSApICk7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NTA6MTogcnVsZV9fRm9jdXNpbmdFbnVtX19BbHRlcm5hdGl2ZXMgOiAoICggKCAnRm9yd2FyZCcgKSApIHwgKCAoICdCYWNrd2FyZCcgKSApICk7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdFbnVtX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NDg6MTogKCAoICggJ0ZvcndhcmQnICkgKSB8ICggKCAnQmFja3dhcmQnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU1NDoxOiAoICggKCAnRm9yd2FyZCcgKSApIHwgKCAoICdCYWNrd2FyZCcgKSApICkKICAgICAgICAgICAgIGludCBhbHQ0Nz0yOwogICAgICAgICAgICAgaW50IExBNDdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTQ3XzA9PTU3KSApIHsKKyAgICAgICAgICAgIGlmICggKExBNDdfMD09NTgpICkgewogICAgICAgICAgICAgICAgIGFsdDQ3PTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBNDdfMD09NTgpICkgeworICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ3XzA9PTU5KSApIHsKICAgICAgICAgICAgICAgICBhbHQ0Nz0yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CkBAIC0xMzIyOSwxOCArMTMyNzUsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDcpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU0OToyOiAoICggJ0ZvcndhcmQnICkgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU1NToyOiAoICggJ0ZvcndhcmQnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTQ5OjI6ICggKCAnRm9yd2FyZCcgKSApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTUwOjM6ICggJ0ZvcndhcmQnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NTU6MjogKCAoICdGb3J3YXJkJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NTY6MzogKCAnRm9yd2FyZCcgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VudW1BY2Nlc3MoKS5nZXRGT1JXQVJERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU1MTozOiAoICdGb3J3YXJkJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTUxOjQ6ICdGb3J3YXJkJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU1NzozOiAoICdGb3J3YXJkJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTU3OjQ6ICdGb3J3YXJkJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDU3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNTgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTMyNTQsMTggKzEzMzAwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NTU6MjogKCAoICdCYWNrd2FyZCcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTYxOjI6ICggKCAnQmFja3dhcmQnICkgKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTU1OjI6ICggKCAnQmFja3dhcmQnICkgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU1NjozOiAoICdCYWNrd2FyZCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU2MToyOiAoICggJ0JhY2t3YXJkJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NjI6MzogKCAnQmFja3dhcmQnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdFbnVtQWNjZXNzKCkuZ2V0QkFDS1dBUkRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTU3OjM6ICggJ0JhY2t3YXJkJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTU3OjQ6ICdCYWNrd2FyZCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NjM6MzogKCAnQmFja3dhcmQnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NjM6NDogJ0JhY2t3YXJkJwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDU4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNTksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTMyOTYsMTQgKzEzMzQyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NjU6MTogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzAgOiBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NzE6MTogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzAgOiBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1Njk6MTogKCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU3MDoyOiBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1NzU6MTogKCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU3NjoyOiBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNSk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMTMzMzQsMjIgKzEzMzgwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1Nzc6MTogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU4MzoxOiBydWxlX19TdHJhdGVneU1vZGVsX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTgxOjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU4MjoxOiAoICggcnVsZV9fU3RyYXRlZ3lNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU4NzoxOiAoICggKCBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1ODg6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1ODI6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1ODM6MjogKCBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU4ODoxOiAoICggcnVsZV9fU3RyYXRlZ3lNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU4OToyOiAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lNb2RlbEFjY2VzcygpLmdldEltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1ODQ6MjogKCBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU5MDoyOiAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgKT8KICAgICAgICAgICAgIGludCBhbHQ0OD0yOwogICAgICAgICAgICAgaW50IExBNDhfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0xMzM1OCw3ICsxMzQwNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1ODQ6MzogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fSW1wb3J0U2VjdGlvbkFzc2lnbm1lbnRfMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzU5MDozOiBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAoKTsKQEAgLTEzMzk2LDE0ICsxMzQ0MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTkyOjE6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTk4OjE6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNTk2OjE6ICggcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM1OTc6MjogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjAyOjE6ICggcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MDM6MjogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lNb2RlbF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTEzNDI5LDM1ICsxMzQ3NSwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjAzOjE6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjA5OjE6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjA3OjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MDg6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjEzOjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MTQ6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjA4OjE6ICggKCBydWxlX19TdHJhdGVneU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYwOToyOiAoIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYxNDoxOiAoICggcnVsZV9fU3RyYXRlZ3lNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MTU6MjogKCBydWxlX19TdHJhdGVneU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneU1vZGVsQWNjZXNzKCkuZ2V0UGFja2FnZXNBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MTA6MjogKCBydWxlX19TdHJhdGVneU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MTY6MjogKCBydWxlX19TdHJhdGVneU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSApKgogICAgICAgICAgICAgbG9vcDQ5OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ0OT0yOwogICAgICAgICAgICAgICAgIGludCBMQTQ5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBNDlfMD09NTkpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBNDlfMD09NjApICkgewogICAgICAgICAgICAgICAgICAgICBhbHQ0OT0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjEwOjM6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjE2OjM6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNik7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xKCk7CkBAIC0xMzQ5OCwxNCArMTM1NDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjE5OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzAgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjI1OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzAgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MjM6MTogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2MjQ6MjogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYyOToxOiAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYzMDoyOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzUpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMTM1MzYsMjMgKzEzNTgyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYzMToxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYzNzoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjM1OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjM2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NDE6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NDI6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYzNjoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjM3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY0MjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjQzOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5UGFja2FnZUFjY2VzcygpLmdldFN0cmF0ZWd5UGFja2FnZUFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjM4OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzYzODozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjQ0OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY0NDozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMTM1NzcsMTQgKzEzNjIzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY0NjoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY1MjoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjUwOjE6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjUxOjI6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NTY6MTogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NTc6MjogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTEzNjE1LDIyICsxMzY2MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NTg6MTogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMV9fSW1wbCA6ICggJ3BhY2thZ2UnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjY0OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzFfX0ltcGwgOiAoICdwYWNrYWdlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjYyOjE6ICggKCAncGFja2FnZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY2MzoxOiAoICdwYWNrYWdlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY2ODoxOiAoICggJ3BhY2thZ2UnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2Njk6MTogKCAncGFja2FnZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NjM6MTogKCAncGFja2FnZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2NjQ6MjogJ3BhY2thZ2UnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY2OToxOiAoICdwYWNrYWdlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY3MDoyOiAncGFja2FnZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lQYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw1OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lQYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xMzY1NiwxNCArMTM3MDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjczOjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzIgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjc5OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzIgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2Nzc6MTogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2Nzg6MjogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY4MzoxOiAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY4NDoyOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtMTM2OTQsMjMgKzEzNzQwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY4NToxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjkxOjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY4OToxOiAoICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjkwOjE6ICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY5NToxOiAoICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjk2OjE6ICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY5MDoxOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2OTE6MjogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM2OTY6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjk3OjI6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lQYWNrYWdlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY5MjoyOiAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzY5MjozOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjk4OjI6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNjk4OjM6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIoKTsKQEAgLTEzNzQ1LDE0ICsxMzc5MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MDA6MTogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fMyA6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzA2OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzMgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzA0OjE6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzcwNToyOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzcxMDoxOiAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MTE6MjogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18zX19JbXBsKCk7CkBAIC0xMzc3OCwzMSArMTM4MjQsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzExOjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzE3OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MTU6MTogKCAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MTY6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzcyMToxOiAoICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzcyMjoxOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzE2OjE6ICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MTc6MjogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzIyOjE6ICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MjM6MjogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzcxODoyOiAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MjQ6MjogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ1MD0yOwogICAgICAgICAgICAgaW50IExBNTBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTUwXzA9PTYwKSApIHsKKyAgICAgICAgICAgIGlmICggKExBNTBfMD09NjEpICkgewogICAgICAgICAgICAgICAgIGFsdDUwPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MTg6MzogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzI0OjM6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAoKTsKQEAgLTEzODQwLDE0ICsxMzg4NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzcyNzoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzczMzoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3MzE6MTogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzMyOjI6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzM3OjE6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzczODoyOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185KTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbCgpOwpAQCAtMTM4NzgsMjIgKzEzOTI0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzM5OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzQ1OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbCA6ICggJ3snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc0MzoxOiAoICggJ3snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NDQ6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NDk6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzUwOjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzQ0OjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzQ1OjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NTA6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NTE6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5UGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lQYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTEzOTE5LDE0ICsxMzk2NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc1NDoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzEgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc2MDoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzEgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NTg6MTogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzU5OjI6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzY0OjE6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc2NToyOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTEzOTU3LDIzICsxNDAwMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc2NjoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19TdHJhdGVneUFzc2lnbm1lbnRfM18xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NzI6MTogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fU3RyYXRlZ3lBc3NpZ25tZW50XzNfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc3MDoxOiAoICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzcxOjE6ICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc3NjoxOiAoICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzc3OjE6ICggKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc3MToxOiAoICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19TdHJhdGVneUFzc2lnbm1lbnRfM18xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3NzI6MjogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3Nzc6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fU3RyYXRlZ3lBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzc4OjI6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19TdHJhdGVneUFzc2lnbm1lbnRfM18xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lQYWNrYWdlQWNjZXNzKCkuZ2V0U3RyYXRlZ3lBc3NpZ25tZW50XzNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc3MzoyOiAoIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fU3RyYXRlZ3lBc3NpZ25tZW50XzNfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc3MzozOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzc5OjI6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19TdHJhdGVneUFzc2lnbm1lbnRfM18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzc5OjM6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fU3RyYXRlZ3lBc3NpZ25tZW50XzNfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEoKTsKQEAgLTE0MDA4LDE0ICsxNDA1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc4MToxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzIgOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzg3OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMiA6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzg1OjE6ICggcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzg2OjI6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3OTE6MTogKCBydWxlX19TdHJhdGVneVBhY2thZ2VfX0dyb3VwXzNfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3OTI6MjogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMl9fSW1wbCgpOwpAQCAtMTQwNDEsMjIgKzE0MDg3LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19Hcm91cF8zX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzkyOjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMl9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzk4OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMl9fSW1wbCA6ICggJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fR3JvdXBfM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzc5NjoxOiAoICggJ30nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM3OTc6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MDI6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODAzOjE6ICggJ30nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzk3OjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozNzk4OjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MDM6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MDQ6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTQwODIsMTQgKzE0MTI4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODA4OjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMCA6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODE0OjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMCA6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzgxMjoxOiAoIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MTM6MjogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MTg6MTogKCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODE5OjI6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsKCk7CkBAIC0xNDEyMCwyMyArMTQxNjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MjA6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzgyNjoxOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzgyNDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzgyNToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODMwOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODMxOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MjU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzgyNjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MzE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzgzMjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneUFjY2VzcygpLmdldFN0cmF0ZWd5QWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4Mjc6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODI3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MzM6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODMzOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0xNDE2MSwxNCArMTQyMDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4MzU6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NDE6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODM5OjE6ICggcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg0MDoyOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg0NToxOiAoIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NDY6MjogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOCk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTE0MTk5LDIyICsxNDI0NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg0NzoxOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgOiAoICdzdHJhdGVneScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NTM6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIDogKCAnc3RyYXRlZ3knICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg1MToxOiAoICggJ3N0cmF0ZWd5JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODUyOjE6ICggJ3N0cmF0ZWd5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg1NzoxOiAoICggJ3N0cmF0ZWd5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODU4OjE6ICggJ3N0cmF0ZWd5JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg1MjoxOiAoICdzdHJhdGVneScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NTM6MjogJ3N0cmF0ZWd5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NTg6MTogKCAnc3RyYXRlZ3knICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODU5OjI6ICdzdHJhdGVneScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lBY2Nlc3MoKS5nZXRTdHJhdGVneUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lBY2Nlc3MoKS5nZXRTdHJhdGVneUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNDI0MCwxNCArMTQyODYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NjI6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yIDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4Njg6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yIDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODY2OjE6ICggcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg2NzoyOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg3MjoxOiAoIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMl9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NzM6MjogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsKCk7CkBAIC0xNDI3OCwyMiArMTQzMjQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4NzQ6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4ODA6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODc4OjE6ICggKCAneycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg3OToxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg4NDoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4ODU6MTogKCAneycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4Nzk6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4ODA6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg4NToxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg4NjoyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDYwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDYxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTQzMTksMTQgKzE0MzY1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODg5OjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMyA6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozODk1OjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMyA6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzg5MzoxOiAoIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4OTQ6MjogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM4OTk6MTogKCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTAwOjI6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMTQzNTcsMjMgKzE0NDAzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTAxOjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTA3OjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkwNToxOiAoICggKCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MDY6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MTE6MTogKCAoICggcnVsZV9fU3RyYXRlZ3lfX1RhcmdldHNBc3NpZ25tZW50XzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTEyOjE6ICggKCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTA2OjE6ICggKCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTA3OjI6ICggcnVsZV9fU3RyYXRlZ3lfX1RhcmdldHNBc3NpZ25tZW50XzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MTI6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MTM6MjogKCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5QWNjZXNzKCkuZ2V0VGFyZ2V0c0Fzc2lnbm1lbnRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkwODoyOiAoIHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTA4OjM6IHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkxNDoyOiAoIHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTE0OjM6IHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5X19UYXJnZXRzQXNzaWdubWVudF8zKCk7CkBAIC0xNDQwOCwxNCArMTQ0NTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MTY6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180IDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MjI6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180IDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTIwOjE6ICggcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkyMToyOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkyNjoxOiAoIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5Mjc6MjogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTApOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsKCk7CkBAIC0xNDQ0NiwyMyArMTQ0OTIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5Mjg6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkzNDoxOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkzMjoxOiAoICggKCBydWxlX19TdHJhdGVneV9fU3RyYXRlZ3lEZWZhdWx0QXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkzMzoxOiAoICggcnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTM4OjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTM5OjE6ICggKCBydWxlX19TdHJhdGVneV9fU3RyYXRlZ3lEZWZhdWx0QXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MzM6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkzNDoyOiAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5Mzk6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk0MDoyOiAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneUFjY2VzcygpLmdldFN0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MzkzNToyOiAoIHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5MzU6MzogcnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NDE6MjogKCBydWxlX19TdHJhdGVneV9fU3RyYXRlZ3lEZWZhdWx0QXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTQxOjM6IHJ1bGVfX1N0cmF0ZWd5X19TdHJhdGVneURlZmF1bHRBc3NpZ25tZW50XzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCgpOwpAQCAtMTQ0OTcsMTQgKzE0NTQzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTQzOjE6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNSA6IHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NDk6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181IDogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NDc6MTogKCBydWxlX19TdHJhdGVneV9fR3JvdXBfXzVfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NDg6MjogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk1MzoxOiAoIHJ1bGVfX1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk1NDoyOiBydWxlX19TdHJhdGVneV9fR3JvdXBfXzVfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsKCk7CkBAIC0xNDUzMCwyMiArMTQ1NzYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NTQ6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NjA6MTogcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTU4OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk1OToxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk2NDoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NjU6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NTk6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NjA6MjogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk2NToxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk2NjoyOiAnfScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNDU3MSwxNCArMTQ2MTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NzA6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5NzY6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTc0OjE6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk3NToyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk4MDoxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5ODE6MjogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTEpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wX19JbXBsKCk7CkBAIC0xNDYwOSwyMyArMTQ2NTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5ODI6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk4ODoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk4NjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk4NzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTkyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTkzOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5ODc6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk4ODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5OTM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Mzk5NDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneVRhcmdldEFjY2VzcygpLmdldFN0cmF0ZWd5VGFyZ2V0QWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5ODk6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTg5OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5OTU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzozOTk1OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0xNDY1MCwxNCArMTQ2OTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjM5OTc6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwMDM6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDAxOjE6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAwMjoyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAwNzoxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwMDg6MjogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOCk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTE0Njg4LDIyICsxNDczNCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAwOToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzFfX0ltcGwgOiAoICd0YXJnZXRzJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAxNToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzFfX0ltcGwgOiAoICd0YXJnZXRzJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwMTM6MTogKCAoICd0YXJnZXRzJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDE0OjE6ICggJ3RhcmdldHMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDE5OjE6ICggKCAndGFyZ2V0cycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAyMDoxOiAoICd0YXJnZXRzJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAxNDoxOiAoICd0YXJnZXRzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAxNToyOiAndGFyZ2V0cycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDIwOjE6ICggJ3RhcmdldHMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDIxOjI6ICd0YXJnZXRzJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneVRhcmdldEFjY2VzcygpLmdldFRhcmdldHNLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5VGFyZ2V0QWNjZXNzKCkuZ2V0VGFyZ2V0c0tleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNDcyOSwxNCArMTQ3NzUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwMjQ6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18yIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAzMDoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzIgOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAyODoxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAyOToyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDM0OjE6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDM1OjI6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTE0NzYyLDMxICsxNDgwOCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAzNToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNDE6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDAzOToxOiAoICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDQwOjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA0NToxOiAoICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDQ2OjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA0MDoxOiAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNDE6MjogKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNDY6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDQ3OjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lUYXJnZXRBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDQyOjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDQ4OjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ1MT0yOwogICAgICAgICAgICAgaW50IExBNTFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTUxXzA9PTYwKSApIHsKKyAgICAgICAgICAgIGlmICggKExBNTFfMD09NjEpICkgewogICAgICAgICAgICAgICAgIGFsdDUxPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNDI6MzogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNDg6MzogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzAoKTsKQEAgLTE0ODI0LDE0ICsxNDg3MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDUxOjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDU3OjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wIDogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDU1OjE6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNTY6MjogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDYxOjE6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNjI6MjogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEzKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wX19JbXBsKCk7CkBAIC0xNDg2MiwyMiArMTQ5MDgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA2MzoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMF9fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDY5OjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18wX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNjc6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDY4OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDczOjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA3NDoxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA2ODoxOiAoICd7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA2OToyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDc0OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDc1OjI6ICd7JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneVRhcmdldEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lUYXJnZXRBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTQ5MDMsMTQgKzE0OTQ5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwNzg6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEgOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwODQ6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEgOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwODI6MTogKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA4MzoyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwODg6MTogKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA4OToyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzFfX0ltcGwoKTsKQEAgLTE0OTQxLDM1ICsxNDk4NywzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDkwOjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18xX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19MYXlvdXRpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzEgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwOTY6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0xheW91dGluZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDA5NDoxOiAoICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwOTU6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19MYXlvdXRpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMDA6MTogKCAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0xheW91dGluZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTAxOjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDk1OjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDk2OjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0xheW91dGluZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMDE6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19MYXlvdXRpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMDI6MjogKCBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5VGFyZ2V0QWNjZXNzKCkuZ2V0TGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MDk3OjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0xheW91dGluZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMDM6MjogKCBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xICkqCiAgICAgICAgICAgICBsb29wNTI6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDUyPTI7CiAgICAgICAgICAgICAgICAgaW50IExBNTJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1Ml8wPT02NCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE1Ml8wPT02NSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDUyPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUyKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQwOTc6MzogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0xheW91dGluZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEwMzozOiBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTQpOwogICAgICAgICAgICAgCSAgICBydWxlX19TdHJhdGVneVRhcmdldF9fTGF5b3V0aW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8xKCk7CkBAIC0xNTAxMCwxNCArMTUwNTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEwNToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiA6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDExMToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMiA6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEwOToxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTEwOjI6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDExNToxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTE2OjI6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMyk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMl9fSW1wbCgpOwpAQCAtMTUwNDgsMzUgKzE1MDk0LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMTc6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzJfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8yICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTIzOjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18yX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEyMToxOiAoICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzIgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEyMjoxOiAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8yICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTI3OjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTI4OjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzIgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMjI6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEyMzoyOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMjg6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEyOToyOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneVRhcmdldEFjY2VzcygpLmdldEZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTI0OjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8yICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEzMDoyOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMiApKgogICAgICAgICAgICAgbG9vcDUzOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ1Mz0yOwogICAgICAgICAgICAgICAgIGludCBMQTUzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBNTNfMD09NjYpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBNTNfMD09NjcpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQ1Mz0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTI0OjM6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMgorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEzMDozOiBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzIKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xNSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMigpOwpAQCAtMTUxMTcsMTQgKzE1MTYzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMzI6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzMgOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMzg6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzMgOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxMzY6MTogKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDEzNzoyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNDI6MTogKCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE0MzoyOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTMpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzNfX0ltcGwoKTsKQEAgLTE1MTU1LDM1ICsxNTIwMSwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTQ0OjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX18zX19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ0VuaGFuY2VyQXNzaWdubWVudF8yXzMgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNTA6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzNfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nRW5oYW5jZXJBc3NpZ25tZW50XzJfMyApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE0ODoxOiAoICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNDk6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ0VuaGFuY2VyQXNzaWdubWVudF8yXzMgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNTQ6MTogKCAoICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nRW5oYW5jZXJBc3NpZ25tZW50XzJfMyApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTU1OjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTQ5OjE6ICggKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTUwOjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nRW5oYW5jZXJBc3NpZ25tZW50XzJfMyApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNTU6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ0VuaGFuY2VyQXNzaWdubWVudF8yXzMgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNTY6MjogKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5VGFyZ2V0QWNjZXNzKCkuZ2V0Rm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTUxOjI6ICggcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nRW5oYW5jZXJBc3NpZ25tZW50XzJfMyApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNTc6MjogKCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zICkqCiAgICAgICAgICAgICBsb29wNTQ6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDU0PTI7CiAgICAgICAgICAgICAgICAgaW50IExBNTRfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE1NF8wPT03MikgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE1NF8wPT03MykgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDU0PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU0KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNTE6MzogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nRW5oYW5jZXJBc3NpZ25tZW50XzJfMworICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE1NzozOiBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTYpOwogICAgICAgICAgICAgCSAgICBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zKCk7CkBAIC0xNTIyNCwxNCArMTUyNzAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE1OToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCA6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE2NToxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCA6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE2MzoxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTY0OjI6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE2OToxOiAoIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTcwOjI6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsKCk7CkBAIC0xNTI1NywyMiArMTUzMDMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE3MDoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fR3JvdXBfMl9fNF9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTc2OjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Hcm91cF8yX180X19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0dyb3VwXzJfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxNzQ6MTogKCAoICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTc1OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTgwOjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE4MToxOiAoICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE3NToxOiAoICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE3NjoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTgxOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTgyOjI6ICd9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneVRhcmdldEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8yXzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5VGFyZ2V0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzJfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNTI5OCwxNCArMTUzNDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxODY6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wIDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxOTI6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wIDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MTkwOjE6ICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE5MToyOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDE5NjoxOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxOTc6MjogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTcpOwogICAgICAgICAgICAgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsKCk7CkBAIC0xNTMzNiwyMyArMTUzODIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQxOTg6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIwNDoxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIwMjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIwMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjA4OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjA5OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMDM6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIwNDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMDk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIxMDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdTdHJhdGVneUFjY2VzcygpLmdldExheW91dGluZ1N0cmF0ZWd5QWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMDU6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjA1OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMTE6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjExOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0xNTM3NywxNCArMTU0MjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMTM6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xIDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMTk6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xIDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjE3OjE6ICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIxODoyOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIyMzoxOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMjQ6MjogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTE1NDE1LDIyICsxNTQ2MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIyNToxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgOiAoICdsYXlvdXRpbmdTdHJhdGVneScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMzE6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIDogKCAnbGF5b3V0aW5nU3RyYXRlZ3knICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIyOToxOiAoICggJ2xheW91dGluZ1N0cmF0ZWd5JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjMwOjE6ICggJ2xheW91dGluZ1N0cmF0ZWd5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIzNToxOiAoICggJ2xheW91dGluZ1N0cmF0ZWd5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjM2OjE6ICggJ2xheW91dGluZ1N0cmF0ZWd5JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDIzMDoxOiAoICdsYXlvdXRpbmdTdHJhdGVneScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMzE6MjogJ2xheW91dGluZ1N0cmF0ZWd5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyMzY6MTogKCAnbGF5b3V0aW5nU3RyYXRlZ3knICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjM3OjI6ICdsYXlvdXRpbmdTdHJhdGVneScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRMYXlvdXRpbmdTdHJhdGVneUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRMYXlvdXRpbmdTdHJhdGVneUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNTQ1NiwxNCArMTU1MDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNDA6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yIDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNDY6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yIDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjQ0OjE6ICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI0NToyOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI1MDoxOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMl9fSW1wbCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNTE6MjogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTgpOwogICAgICAgICAgICAgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsKCk7CkBAIC0xNTQ5NCwyMyArMTU1NDAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNTI6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNTg6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjU2OjE6ICggKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI1NzoxOiAoICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI2MjoxOiAoICggKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNjM6MTogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNTc6MTogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNTg6MjogKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI2MzoxOiAoICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI2NDoyOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjU5OjI6ICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNTk6MzogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjY1OjI6ICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNjU6MzogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIoKTsKQEAgLTE1NTQ1LDE0ICsxNTU5MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI2NzoxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzMgOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI3MzoxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzMgOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyNzE6MTogKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjcyOjI6IHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mjc3OjE6ICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX18zX19JbXBsIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI3ODoyOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xOSk7CiAgICAgICAgICAgICBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTE1NTgzLDIyICsxNTYyOSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI3OToxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgOiAoICdsYXlvdXQ9JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI4NToxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgOiAoICdsYXlvdXQ9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyODM6MTogKCAoICdsYXlvdXQ9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mjg0OjE6ICggJ2xheW91dD0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mjg5OjE6ICggKCAnbGF5b3V0PScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI5MDoxOiAoICdsYXlvdXQ9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI4NDoxOiAoICdsYXlvdXQ9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDI4NToyOiAnbGF5b3V0PScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjkwOjE6ICggJ2xheW91dD0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MjkxOjI6ICdsYXlvdXQ9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdTdHJhdGVneUFjY2VzcygpLmdldExheW91dEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRMYXlvdXRLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTU2MjQsMTQgKzE1NjcwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mjk0OjE6IHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fNCA6IHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMDA6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180IDogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyOTg6MTogKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQyOTk6MjogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMwNDoxOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMwNToyOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsKCk7CkBAIC0xNTY1NywyMyArMTU3MDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMDU6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMxMToxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0xheW91dEFzc2lnbm1lbnRfNCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMwOToxOiAoICggKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTGF5b3V0QXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMxMDoxOiAoICggcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0xheW91dEFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzE1OjE6ICggKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzE2OjE6ICggKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTGF5b3V0QXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMTA6MTogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMxMToyOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMTY6MTogKCAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMxNzoyOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdTdHJhdGVneUFjY2VzcygpLmdldExheW91dEFzc2lnbm1lbnRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMxMjoyOiAoIHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMTI6MzogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0xheW91dEFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMTg6MjogKCBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTGF5b3V0QXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzE4OjM6IHJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19MYXlvdXRBc3NpZ25tZW50XzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0xheW91dEFzc2lnbm1lbnRfNCgpOwpAQCAtMTU3MDgsMTQgKzE1NzU0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMjE6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzAgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMjc6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzAgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMjU6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMyNjoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMzE6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMzMjoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjApOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTE1NzQ2LDIzICsxNTc5MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzMzOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDMzOToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMzc6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMzg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM0MzoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM0NDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzM4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzMzk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzQ0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNDU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEZvY3VzaW5nU3RyYXRlZ3lBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM0MDoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNDA6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM0NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNDY6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTE1Nzg3LDE0ICsxNTgzMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzQ4OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18xIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzU0OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18xIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzUyOjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNTM6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzU4OjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNTk6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTE1ODI1LDIyICsxNTg3MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzYwOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18xX19JbXBsIDogKCAnZm9jdXNpbmdTdHJhdGVneScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNjY6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzFfX0ltcGwgOiAoICdmb2N1c2luZ1N0cmF0ZWd5JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM2NDoxOiAoICggJ2ZvY3VzaW5nU3RyYXRlZ3knICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNjU6MTogKCAnZm9jdXNpbmdTdHJhdGVneScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNzA6MTogKCAoICdmb2N1c2luZ1N0cmF0ZWd5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzcxOjE6ICggJ2ZvY3VzaW5nU3RyYXRlZ3knICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzY1OjE6ICggJ2ZvY3VzaW5nU3RyYXRlZ3knICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzY2OjI6ICdmb2N1c2luZ1N0cmF0ZWd5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNzE6MTogKCAnZm9jdXNpbmdTdHJhdGVneScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzNzI6MjogJ2ZvY3VzaW5nU3RyYXRlZ3knCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRGb2N1c2luZ1N0cmF0ZWd5S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDY2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDY3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0Rm9jdXNpbmdTdHJhdGVneUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNTg2NiwxNCArMTU5MTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM3NToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMiA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM4MToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMiA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM3OToxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzgwOjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM4NToxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mzg2OjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yMSk7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtMTU5MDQsMjMgKzE1OTUwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzODc6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0MzkzOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM5MToxOiAoICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM5MjoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mzk3OjE6ICggKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Mzk4OjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzOTI6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM5MzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzOTg6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM5OToyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDM5NDoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQzOTQ6MzogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MDA6MjogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDAwOjM6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMigpOwpAQCAtMTU5NTUsMTQgKzE2MDAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MDI6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzMgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MDg6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzMgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MDY6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQwNzoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MTI6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQxMzoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMTU5OTMsMjIgKzE2MDM5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MTQ6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgOiAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MjA6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwgOiAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MTg6MTogKCAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQxOToxOiAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MjQ6MTogKCAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQyNToxOiAoICdlY3ZpZXdGb2N1c2luZ0lkPScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0MTk6MTogKCAnZWN2aWV3Rm9jdXNpbmdJZD0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDIwOjI6ICdlY3ZpZXdGb2N1c2luZ0lkPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDI1OjE6ICggJ2Vjdmlld0ZvY3VzaW5nSWQ9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQyNjoyOiAnZWN2aWV3Rm9jdXNpbmdJZD0nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRFY3ZpZXdGb2N1c2luZ0lkS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDY3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDY4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0RWN2aWV3Rm9jdXNpbmdJZEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNjAzNCwxNCArMTYwODAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQyOToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQzNToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQzMzoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDM0OjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQzOToxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDQwOjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yMik7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtMTYwNzIsMjMgKzE2MTE4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NDE6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRWN2aWV3Rm9jdXNpbmdJZEFzc2lnbm1lbnRfNCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDQ3OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ0NToxOiAoICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19FY3ZpZXdGb2N1c2luZ0lkQXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ0NjoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRWN2aWV3Rm9jdXNpbmdJZEFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDUxOjE6ICggKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDUyOjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19FY3ZpZXdGb2N1c2luZ0lkQXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NDY6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ0NzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NTI6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ1MzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0RWN2aWV3Rm9jdXNpbmdJZEFzc2lnbm1lbnRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ0ODoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NDg6MzogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRWN2aWV3Rm9jdXNpbmdJZEFzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NTQ6MjogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19FY3ZpZXdGb2N1c2luZ0lkQXNzaWdubWVudF80ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDU0OjM6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRWN2aWV3Rm9jdXNpbmdJZEFzc2lnbm1lbnRfNCgpOwpAQCAtMTYxMjMsMTQgKzE2MTY5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NTY6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzUgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NjI6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzUgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NjA6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ2MToyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NjY6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ2NzoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjMpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzVfX0ltcGwoKTsKQEAgLTE2MTYxLDIyICsxNjIwNywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDY4OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX181X19JbXBsIDogKCAnZm9jdXM9JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ3NDoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNV9fSW1wbCA6ICggJ2ZvY3VzPScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NzI6MTogKCAoICdmb2N1cz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NzM6MTogKCAnZm9jdXM9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ3ODoxOiAoICggJ2ZvY3VzPScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ3OToxOiAoICdmb2N1cz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDczOjE6ICggJ2ZvY3VzPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0NzQ6MjogJ2ZvY3VzPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDc5OjE6ICggJ2ZvY3VzPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0ODA6MjogJ2ZvY3VzPScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEZvY3VzS2V5d29yZF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDY4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDY5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0Rm9jdXNLZXl3b3JkXzUoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTYyMDIsMTQgKzE2MjQ4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0ODM6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzYgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0ODk6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzYgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0ODc6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ4ODoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ0OTM6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ5NDoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjQpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzZfX0ltcGwoKTsKQEAgLTE2MjQwLDIzICsxNjI4NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NDk1OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82ICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1MDE6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRm9jdXNBc3NpZ25tZW50XzYgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDQ5OToxOiAoICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Gb2N1c0Fzc2lnbm1lbnRfNiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1MDA6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1MDU6MTogKCAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRm9jdXNBc3NpZ25tZW50XzYgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTA2OjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Gb2N1c0Fzc2lnbm1lbnRfNiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTAwOjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Gb2N1c0Fzc2lnbm1lbnRfNiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTAxOjI6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRm9jdXNBc3NpZ25tZW50XzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1MDY6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1MDc6MjogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Gb2N1c0Fzc2lnbm1lbnRfNiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRGb2N1c0Fzc2lnbm1lbnRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUwMjoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTAyOjM6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUwODoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTA4OjM6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82KCk7CkBAIC0xNjI5MSwxNCArMTYzMzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUxMDoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUxNjoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNyA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUxNDoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTE1OjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUyMDoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTIxOjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsKCk7CkBAIC0xNjMyNCwzMSArMTYzNzAsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fN19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUyMToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF9fN19fSW1wbCA6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTI3OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwX183X19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfXzdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1MjU6MTogKCAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTI2OjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTMxOjE6ICggKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUzMjoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUyNjoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUyNzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTMyOjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTMzOjI6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0R3JvdXBfNygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUyODoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTM0OjI6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCApPwogICAgICAgICAgICAgaW50IGFsdDU1PTI7CiAgICAgICAgICAgICBpbnQgTEE1NV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNTVfMD09NjkpICkgeworICAgICAgICAgICAgaWYgKCAoTEE1NV8wPT03MCkgKSB7CiAgICAgICAgICAgICAgICAgYWx0NTU9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUyODozOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTM0OjM6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCgpOwpAQCAtMTYzODYsMTQgKzE2NDMyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDUzNzoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU0MzoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTQxOjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTQyOjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NDc6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NDg6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184KTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzBfX0ltcGwoKTsKQEAgLTE2NDI0LDIyICsxNjQ3MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NDk6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMF9fSW1wbCA6ICggJ2tleVN0cm9rZURlZmluaXRpb24nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTU1OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzBfX0ltcGwgOiAoICdrZXlTdHJva2VEZWZpbml0aW9uJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTUzOjE6ICggKCAna2V5U3Ryb2tlRGVmaW5pdGlvbicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU1NDoxOiAoICdrZXlTdHJva2VEZWZpbml0aW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU1OToxOiAoICggJ2tleVN0cm9rZURlZmluaXRpb24nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NjA6MTogKCAna2V5U3Ryb2tlRGVmaW5pdGlvbicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NTQ6MTogKCAna2V5U3Ryb2tlRGVmaW5pdGlvbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NTU6MjogJ2tleVN0cm9rZURlZmluaXRpb24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU2MDoxOiAoICdrZXlTdHJva2VEZWZpbml0aW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU2MToyOiAna2V5U3Ryb2tlRGVmaW5pdGlvbicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEtleVN0cm9rZURlZmluaXRpb25LZXl3b3JkXzdfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEtleVN0cm9rZURlZmluaXRpb25LZXl3b3JkXzdfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNjQ2NSwxNCArMTY1MTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTY0OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzEgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTcwOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzEgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1Njg6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1Njk6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU3NDoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU3NToyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI1KTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzFfX0ltcGwoKTsKQEAgLTE2NTAzLDIyICsxNjU0OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1NzY6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMV9fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTgyOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzFfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTgwOjE6ICggKCAneycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU4MToxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU4NjoxOiAoICggJ3snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1ODc6MTogKCAneycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1ODE6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1ODI6MjogJ3snCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU4NzoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDU4ODoyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzdfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNjU0NCwxNCArMTY1OTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTkxOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NTk3OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1OTU6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ1OTY6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYwMToxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYwMjoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMl9fSW1wbCgpOwpAQCAtMTY1ODIsMjIgKzE2NjI4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYwMzoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18yX19JbXBsIDogKCAna2V5Q29kZT0nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjA5OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzJfX0ltcGwgOiAoICdrZXlDb2RlPScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYwNzoxOiAoICggJ2tleUNvZGU9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjA4OjE6ICggJ2tleUNvZGU9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYxMzoxOiAoICggJ2tleUNvZGU9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjE0OjE6ICggJ2tleUNvZGU9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYwODoxOiAoICdrZXlDb2RlPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MDk6MjogJ2tleUNvZGU9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MTQ6MTogKCAna2V5Q29kZT0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjE1OjI6ICdrZXlDb2RlPScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEtleUNvZGVLZXl3b3JkXzdfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEtleUNvZGVLZXl3b3JkXzdfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNjYyMywxNCArMTY2NjksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjE4OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjI0OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MjI6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MjM6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fM19fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X180CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYyODoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYyOToyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI2KTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzNfX0ltcGwoKTsKQEAgLTE2NjYxLDIzICsxNjcwNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MzA6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fM19fSW1wbCA6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19LZXlDb2RlQXNzaWdubWVudF83XzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYzNjoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X18zX19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0tleUNvZGVBc3NpZ25tZW50XzdfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MzQ6MTogKCAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDYzNToxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NDA6MTogKCAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY0MToxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2MzU6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0tleUNvZGVBc3NpZ25tZW50XzdfMyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjM2OjI6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjQxOjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19LZXlDb2RlQXNzaWdubWVudF83XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY0MjoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0tleUNvZGVBc3NpZ25tZW50XzdfMyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRLZXlDb2RlQXNzaWdubWVudF83XzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2Mzc6MjogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19LZXlDb2RlQXNzaWdubWVudF83XzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2Mzc6MzogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY0MzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0tleUNvZGVBc3NpZ25tZW50XzdfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY0MzozOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19LZXlDb2RlQXNzaWdubWVudF83XzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zKCk7CkBAIC0xNjcxMiwxNCArMTY3NTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X180IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjQ1OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzUgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjUxOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NDk6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NTA6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X181CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY1NToxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzRfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY1NjoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzI2KTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzRfX0ltcGwoKTsKQEAgLTE2NzUwLDMxICsxNjc5NiwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NTc6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNF9fSW1wbCA6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NjM6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNF9fSW1wbCA6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY2MToxOiAoICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY2MjoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjY3OjE6ICggKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjY4OjE6ICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NjI6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY2MzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2Njg6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY2OToyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0R3JvdXBfN180KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjY0OjI6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY3MDoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCApPwogICAgICAgICAgICAgaW50IGFsdDU2PTI7CiAgICAgICAgICAgICBpbnQgTEE1Nl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBNTZfMD09NzEpICkgeworICAgICAgICAgICAgaWYgKCAoTEE1Nl8wPT03MikgKSB7CiAgICAgICAgICAgICAgICAgYWx0NTY9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTYpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY2NDozOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NzA6MzogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCgpOwpAQCAtMTY4MTIsMTQgKzE2ODU4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY3MjoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X181IDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2Nzg6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNSA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzVfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2NzY6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X181X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Njc3OjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzVfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NjgyOjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY4MzoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X181X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzVfX0ltcGwoKTsKQEAgLTE2ODQ1LDIyICsxNjg5MSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2ODM6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN19fNV9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Njg5OjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfXzVfX0ltcGwgOiAoICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83X181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Njg3OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY4ODoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY5MzoxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2OTQ6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2ODg6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ2ODk6MjogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY5NDoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY5NToyOiAnfScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfN181KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE2ODg2LDE0ICsxNjkzMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDY5OToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzBfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDcwNToxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzBfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MDM6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzBfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzA0OjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMF9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzA5OjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDcxMDoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzBfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184KTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMF9fSW1wbCgpOwpAQCAtMTY5MjQsMjIgKzE2OTcwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzExOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMF9fSW1wbCA6ICggJ21vZGlmaWVyS2V5cycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MTc6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18wX19JbXBsIDogKCAnbW9kaWZpZXJLZXlzJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MTU6MTogKCAoICdtb2RpZmllcktleXMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MTY6MTogKCAnbW9kaWZpZXJLZXlzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDcyMToxOiAoICggJ21vZGlmaWVyS2V5cycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDcyMjoxOiAoICdtb2RpZmllcktleXMnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzE2OjE6ICggJ21vZGlmaWVyS2V5cycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MTc6MjogJ21vZGlmaWVyS2V5cycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzIyOjE6ICggJ21vZGlmaWVyS2V5cycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MjM6MjogJ21vZGlmaWVyS2V5cycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldE1vZGlmaWVyS2V5c0tleXdvcmRfN180XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRNb2RpZmllcktleXNLZXl3b3JkXzdfNF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE2OTY1LDE0ICsxNzAxMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDcyNjoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzEgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDczMjoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzEgOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3MzA6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzMxOjI6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzM2OjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18xX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDczNzoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yNyk7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwoKTsKQEAgLTE3MDAzLDIyICsxNzA0OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDczODoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc0NDoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NDI6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzQzOjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzQ4OjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc0OToxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc0MzoxOiAoICd7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc0NDoyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzQ5OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzUwOjI6ICd7JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfN180XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF83XzRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNzA0NCwxNCArMTcwOTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NTM6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NTk6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzU3OjE6ICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc1ODoyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc2MzoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMl9fSW1wbCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NjQ6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMjcpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsKCk7CkBAIC0xNzA4MiwyMiArMTcxMjgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NjU6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NzE6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzY5OjE6ICggKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc3MDoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTW9kaWZpZXJLZXlzQXNzaWdubWVudF83XzRfMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc3NToxOiAoICggKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NzY6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NzA6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NzE6MjogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc3NjoxOiAoICggcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTW9kaWZpZXJLZXlzQXNzaWdubWVudF83XzRfMiApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc3NzoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldE1vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3NzI6MjogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc3ODoyOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIgKSoKICAgICAgICAgICAgIGxvb3A1NzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0NTc9MjsKQEAgLTE3MTEwLDcgKzE3MTU2LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTcpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc3MjozOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Nzc4OjM6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTW9kaWZpZXJLZXlzQXNzaWdubWVudF83XzRfMigpOwpAQCAtMTcxNTEsMTQgKzE3MTk3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0NzgwOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fMyA6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3ODY6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zIDogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3ODQ6MTogKCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3ODU6MjogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc5MDoxOiAoIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0dyb3VwXzdfNF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc5MToyOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zX19JbXBsKCk7CkBAIC0xNzE4NCwyMiArMTcyMzAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Hcm91cF83XzRfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3OTE6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zX19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3OTc6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zX19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fR3JvdXBfN180X18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0Nzk1OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDc5NjoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgwMToxOiAoICggJ30nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4MDI6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3OTY6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ3OTc6MjogJ30nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgwMjoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgwMzoyOiAnfScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83XzRfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNzIyNSwxNCArMTcyNzEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgwNzoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMCA6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgxMzoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMCA6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgxMToxOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODEyOjI6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgxNzoxOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODE4OjI6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yOCk7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMTcyNjMsMjMgKzE3MzA5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4MTk6MTogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODI1OjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgyMzoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgyNDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODI5OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODMwOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4MjQ6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgyNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4MzA6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgzMToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VuaGFuY2VyQWNjZXNzKCkuZ2V0Rm9jdXNpbmdFbmhhbmNlckFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODI2OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgyNjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODMyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgzMjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMTczMDQsMTQgKzE3MzUwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4MzQ6MTogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzEgOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NDA6MTogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzEgOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4Mzg6MTogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDgzOToyOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NDQ6MTogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg0NToyOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMTczNDIsMjIgKzE3Mzg4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NDY6MTogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzFfX0ltcGwgOiAoICdmb2N1c2luZ0VuaGFuY2VyJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg1MjoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMV9fSW1wbCA6ICggJ2ZvY3VzaW5nRW5oYW5jZXInICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODUwOjE6ICggKCAnZm9jdXNpbmdFbmhhbmNlcicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg1MToxOiAoICdmb2N1c2luZ0VuaGFuY2VyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg1NjoxOiAoICggJ2ZvY3VzaW5nRW5oYW5jZXInICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NTc6MTogKCAnZm9jdXNpbmdFbmhhbmNlcicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NTE6MTogKCAnZm9jdXNpbmdFbmhhbmNlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NTI6MjogJ2ZvY3VzaW5nRW5oYW5jZXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg1NzoxOiAoICdmb2N1c2luZ0VuaGFuY2VyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg1ODoyOiAnZm9jdXNpbmdFbmhhbmNlcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdFbmhhbmNlckFjY2VzcygpLmdldEZvY3VzaW5nRW5oYW5jZXJLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nRW5oYW5jZXJBY2Nlc3MoKS5nZXRGb2N1c2luZ0VuaGFuY2VyS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTE3MzgzLDE0ICsxNzQyOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODYxOjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18yIDogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODY3OjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18yIDogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODY1OjE6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NjY6MjogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODcxOjE6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4NzI6MjogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTE3NDIxLDIzICsxNzQ2NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODczOjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg3OToxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4Nzc6MTogKCAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fTmFtZUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4Nzg6MTogKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg4MzoxOiAoICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg4NDoxOiAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fTmFtZUFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODc4OjE6ICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4Nzk6MjogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODg0OjE6ICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4ODU6MjogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdFbmhhbmNlckFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4ODA6MjogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODgwOjM6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODg2OjI6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fTmFtZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDg4NjozOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19OYW1lQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIoKTsKQEAgLTE3NDcyLDE0ICsxNzUxOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODg4OjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18zIDogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODk0OjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18zIDogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODkyOjE6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4OTM6MjogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0ODk4OjE6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ4OTk6MjogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTE3NTEwLDIyICsxNzU1NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTAwOjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX18zX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MDY6MTogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzNfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkwNDoxOiAoICggJ3snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MDU6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MTA6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTExOjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTA1OjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTA2OjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MTE6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MTI6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nRW5oYW5jZXJBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDYwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDYxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VuaGFuY2VyQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNzU1MSwxNCArMTc1OTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkxNToxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNCA6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkyMToxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNCA6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkxOToxOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTIwOjI6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkyNToxOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTI2OjI6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtMTc1ODksMjYgKzE3NjM1LDI2IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5Mjc6MTogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzRfX0ltcGwgOiAoICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSApICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSogKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzMzoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNF9fSW1wbCA6ICggKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApICkgKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTMxOjE6ICggKCAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkgKSAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkqICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzMjoxOiAoICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSApICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzNzoxOiAoICggKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApICkgKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5Mzg6MTogKCAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkgKSAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkqICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MzI6MTogKCAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkgKSAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5MzM6MjogKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApICkgKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzODoxOiAoICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSApICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzOToyOiAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkgKSAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTMzOjI6ICggKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzNDozOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzOToyOiAoICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5NDA6MzogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VuaGFuY2VyQWNjZXNzKCkuZ2V0Rm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTM1OjM6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTM1OjQ6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5NDE6MzogKCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5NDE6NDogcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180KTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCgpOwpAQCAtMTc2MjQsMTMgKzE3NjcwLDEzIEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5Mzg6MjogKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDkzOTozOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5NDQ6MjogKCAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk0NTozOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VuaGFuY2VyQWNjZXNzKCkuZ2V0Rm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTQwOjM6ICggcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80ICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk0NjozOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCApKgogICAgICAgICAgICAgbG9vcDU4OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ1OD0yOwpAQCAtMTc2NDMsNyArMTc2ODksNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1OCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTQwOjQ6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk0Njo0OiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80KCk7CkBAIC0xNzY4NywxNCArMTc3MzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk0OToxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNSA6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk1NToxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNSA6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk1MzoxOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTU0OjI6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk1OToxOiAoIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTYwOjI6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsKCk7CkBAIC0xNzcyMCwyMiArMTc3NjYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk2MDoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Hcm91cF9fNV9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTY2OjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0dyb3VwX181X19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5NjQ6MTogKCAoICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTY1OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTcwOjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk3MToxOiAoICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk2NToxOiAoICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk2NjoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTcxOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTcyOjI6ICd9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VuaGFuY2VyQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nRW5oYW5jZXJBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xNzc2MSwxNCArMTc4MDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTc2OjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzAgOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTgyOjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzAgOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5ODA6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5ODE6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMF9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk4NjoxOiAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk4NzoyOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTE3Nzk5LDIzICsxNzg0NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5ODg6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5OTQ6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk5MjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk5MzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTk4OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo0OTk5OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5OTM6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk5NDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5OTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAwMDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneURlZmF1bHRBY2Nlc3MoKS5nZXRTdHJhdGVneURlZmF1bHRBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NDk5NToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjQ5OTU6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAwMToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMDE6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTE3ODQwLDE0ICsxNzg4NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMDM6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMSA6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMDk6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMSA6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAwNzoxOiAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAwODoyOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDEzOjE6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMV9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDE0OjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOCk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0xNzg3OCwyMiArMTc5MjQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDE1OjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzFfX0ltcGwgOiAoICdkZWZhdWx0JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAyMToxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18xX19JbXBsIDogKCAnZGVmYXVsdCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAxOToxOiAoICggJ2RlZmF1bHQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMjA6MTogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMjU6MTogKCAoICdkZWZhdWx0JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDI2OjE6ICggJ2RlZmF1bHQnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDIwOjE6ICggJ2RlZmF1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDIxOjI6ICdkZWZhdWx0JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMjY6MTogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwMjc6MjogJ2RlZmF1bHQnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTc5MTksMTQgKzE3OTY1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAzMDoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yIDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTAzNjoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yIDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDM0OjE6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDM1OjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNDA6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNDE6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yOSk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yX19JbXBsKCk7CkBAIC0xNzk1NywyMiArMTgwMDMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDQyOjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzJfX0ltcGwgOiAoICd7JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA0ODoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA0NjoxOiAoICggJ3snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNDc6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNTI6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDUzOjE6ICggJ3snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDQ3OjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDQ4OjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNTM6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNTQ6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTc5OTgsMTQgKzE4MDQ0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA1NzoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zIDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA2MzoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zIDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDYxOjE6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDYyOjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNjc6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNjg6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fM19fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTE4MDM2LDIyICsxODA4MiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNjk6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fM19fSW1wbCA6ICggJ2RlZmF1bHRMYXlvdXRpbmc9JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA3NToxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX18zX19JbXBsIDogKCAnZGVmYXVsdExheW91dGluZz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNzM6MTogKCAoICdkZWZhdWx0TGF5b3V0aW5nPScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA3NDoxOiAoICdkZWZhdWx0TGF5b3V0aW5nPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNzk6MTogKCAoICdkZWZhdWx0TGF5b3V0aW5nPScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA4MDoxOiAoICdkZWZhdWx0TGF5b3V0aW5nPScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwNzQ6MTogKCAnZGVmYXVsdExheW91dGluZz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDc1OjI6ICdkZWZhdWx0TGF5b3V0aW5nPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDgwOjE6ICggJ2RlZmF1bHRMYXlvdXRpbmc9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA4MToyOiAnZGVmYXVsdExheW91dGluZz0nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRMYXlvdXRpbmdLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRMYXlvdXRpbmdLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTgwNzcsMTQgKzE4MTIzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA4NDoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNF9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTA5MDoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNF9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDg4OjE6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNF9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDg5OjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwOTQ6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180X19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUwOTU6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNF9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zMCk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180X19JbXBsKCk7CkBAIC0xODExNSwyMyArMTgxNjEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MDk2OjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0TGF5b3V0aW5nQXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMDI6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRMYXlvdXRpbmdBc3NpZ25tZW50XzQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTAwOjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMDE6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTA2OjE6ICggKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMDc6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTAxOjE6ICggKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRMYXlvdXRpbmdBc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEwMjoyOiAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEwNzoxOiAoICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0TGF5b3V0aW5nQXNzaWdubWVudF80ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMDg6MjogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRMYXlvdXRpbmdBc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneURlZmF1bHRBY2Nlc3MoKS5nZXREZWZhdWx0TGF5b3V0aW5nQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTAzOjI6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0TGF5b3V0aW5nQXNzaWdubWVudF80ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTAzOjM6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMDk6MjogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRMYXlvdXRpbmdBc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMDk6MzogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0TGF5b3V0aW5nQXNzaWdubWVudF80CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCgpOwpAQCAtMTgxNjYsMTQgKzE4MjEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTExMToxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNV9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTExNzoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNV9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTE1OjE6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNV9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTE2OjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMjE6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181X19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMjI6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNV9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzVfX0ltcGwoKTsKQEAgLTE4MjA0LDIyICsxODI1MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMjM6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNV9fSW1wbCA6ICggJ2RlZmF1bHRGb2N1c2luZz0nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTI5OjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzVfX0ltcGwgOiAoICdkZWZhdWx0Rm9jdXNpbmc9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTI3OjE6ICggKCAnZGVmYXVsdEZvY3VzaW5nPScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEyODoxOiAoICdkZWZhdWx0Rm9jdXNpbmc9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEzMzoxOiAoICggJ2RlZmF1bHRGb2N1c2luZz0nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMzQ6MTogKCAnZGVmYXVsdEZvY3VzaW5nPScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMjg6MTogKCAnZGVmYXVsdEZvY3VzaW5nPScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxMjk6MjogJ2RlZmF1bHRGb2N1c2luZz0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEzNDoxOiAoICdkZWZhdWx0Rm9jdXNpbmc9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEzNToyOiAnZGVmYXVsdEZvY3VzaW5nPScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lEZWZhdWx0QWNjZXNzKCkuZ2V0RGVmYXVsdEZvY3VzaW5nS2V5d29yZF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneURlZmF1bHRBY2Nlc3MoKS5nZXREZWZhdWx0Rm9jdXNpbmdLZXl3b3JkXzUoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTgyNDUsMTQgKzE4MjkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTEzODoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE0NDoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTQyOjE6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTQzOjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNDg6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182X19JbXBsIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNDk6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNl9fSW1wbCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMCk7CiAgICAgICAgICAgICBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182X19JbXBsKCk7CkBAIC0xODI4MywyMyArMTgzMjksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTUwOjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0Rm9jdXNpbmdBc3NpZ25tZW50XzYgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE1NjoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX182X19JbXBsIDogKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE1NDoxOiAoICggKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNTU6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNjA6MTogKCAoICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0Rm9jdXNpbmdBc3NpZ25tZW50XzYgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTYxOjE6ICggKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTU1OjE6ICggKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTU2OjI6ICggcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0Rm9jdXNpbmdBc3NpZ25tZW50XzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNjE6MTogKCAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNjI6MjogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE1NzoyOiAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTU3OjM6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE2MzoyOiAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTYzOjM6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdEZvY3VzaW5nQXNzaWdubWVudF82KCk7CkBAIC0xODMzNCwxNCArMTgzODAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTY1OjE6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzcgOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE3MToxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183IDogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fN19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE2OToxOiAoIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzdfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNzA6MjogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fN19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxNzU6MTogKCBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTc2OjI6IHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzdfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fN19fSW1wbCgpOwpAQCAtMTgzNjcsMjIgKzE4NDEzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fN19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE3NjoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0dyb3VwX183X19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxODI6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19Hcm91cF9fN19fSW1wbCA6ICggJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fR3JvdXBfXzdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUxODA6MTogKCAoICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTgxOjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTg2OjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE4NzoxOiAoICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE4MToxOiAoICd9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE4MjoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTg3OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTg4OjI6ICd9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneURlZmF1bHRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lEZWZhdWx0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSk7IAogICAgICAgICAgICAgfQpAQCAtMTg0MDgsMTQgKzE4NDU0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE5MjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTE5ODoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTk2OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MTk3OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMDI6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMDM6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zMSk7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsKCk7CkBAIC0xODQ0NiwyMyArMTg0OTIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjA0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjEwOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMDg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMDk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTIxNDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTIxNToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjA5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMTA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjE1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMTY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0T1hJbXBvcnREZWNsYXJhdGlvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjExOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTIxMTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjE3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTIxNzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMTg0ODcsMTQgKzE4NTMzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTIxOToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTIyNToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjIzOjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjI0OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMjk6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMzA6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0xODUyNSwxNyArMTg1NzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjMxOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdpbXBvcnQnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjM3OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdpbXBvcnQnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMzU6MTogKCAoICdpbXBvcnQnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMzY6MTogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI0MToxOiAoICggJ2ltcG9ydCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI0MjoxOiAoICdpbXBvcnQnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjM2OjE6ICggJ2ltcG9ydCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyMzc6MjogJ2ltcG9ydCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjQyOjE6ICggJ2ltcG9ydCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNDM6MjogJ2ltcG9ydCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8xKCkpOyAKQEAgLTE4NTY2LDE0ICsxODYxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNDY6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNTI6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI1MDoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI1MToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjU2OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjU3OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzMpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtMTg2MDQsMjMgKzE4NjUwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI1ODoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI2NDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjYyOjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjYzOjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNjg6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNjk6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI2MzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjY0OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI2OToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjcwOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjY1OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI2NTozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI3MToyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNzE6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yKCk7CkBAIC0xODY1NSwxNCArMTg3MDEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjczOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzMgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI3OToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI3NzoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyNzg6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyODM6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mjg0OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMTg2ODgsMzMgKzE4NzM0LDMzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI4NDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoICc7JyApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI5MDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoICc7JyApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mjg4OjE6ICggKCAoICc7JyApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mjg5OjE6ICggKCAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyOTQ6MTogKCAoICggJzsnICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyOTU6MTogKCAoICc7JyApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI4OToxOiAoICggJzsnICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MjkwOjI6ICggJzsnICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI5NToxOiAoICggJzsnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mjk2OjI6ICggJzsnICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTI5MToyOiAoICc7JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyOTc6MjogKCAnOycgKT8KICAgICAgICAgICAgIGludCBhbHQ1OT0yOwogICAgICAgICAgICAgaW50IExBNTlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTU5XzA9PTc2KSApIHsKKyAgICAgICAgICAgIGlmICggKExBNTlfMD09NzcpICkgewogICAgICAgICAgICAgICAgIGFsdDU5PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUyOTE6MzogJzsnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mjk3OjM6ICc7JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODc0NiwxNCArMTg3OTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMwMDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMwNjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMwNDoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzA1OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMxMDoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzExOjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNCk7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCgpOwpAQCAtMTg3ODQsMjMgKzE4ODMwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMTI6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMTg6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMTY6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMxNzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMjI6MTogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMyMzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMTc6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzE4OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzIzOjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMyNDoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFN0YXRpY0Fzc2lnbm1lbnRfMl8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMTk6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMTk6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMyNToyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMyNTozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzJfMF8wKCk7CkBAIC0xODgzNSwxNCArMTg4ODEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMyNzoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMzMzoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMzMToxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzMyOjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTMzNzoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzM4OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNCk7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCgpOwpAQCAtMTg4NzMsMjIgKzE4OTE5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzMzk6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzQ1OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM0MzoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM0NDoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzQ5OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzUwOjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNDQ6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM0NToyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNTA6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM1MToyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRFeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzQ2OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM1MjoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSApPwogICAgICAgICAgICAgaW50IGFsdDYwPTI7CiAgICAgICAgICAgICBpbnQgTEE2MF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTE4ODk3LDcgKzE4OTQzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjApIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM0NjozOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNTI6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8yXzBfMSgpOwpAQCAtMTg5MzUsMTQgKzE4OTgxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNTQ6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzIgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNjA6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzIgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNTg6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM1OToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNjQ6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM2NToyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMl9fSW1wbCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzUpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzJfX0ltcGwoKTsKQEAgLTE4OTczLDIzICsxOTAxOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzY2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzcyOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzcwOjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNzE6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mzc2OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNzc6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzcxOjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM3MjoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM3NzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNzg6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzczOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1MzczOjM6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNzk6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzNzk6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMigpOwpAQCAtMTkwMjQsMTQgKzE5MDcwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzODE6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzODc6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzODU6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM4NjoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOTE6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM5MjoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCgpOwpAQCAtMTkwNTcsMjMgKzE5MTAzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOTI6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM5ODoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fM19fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mzk2OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTM5NzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQwMjoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MDM6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOTc6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOTg6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yXzBfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQwMzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQwNDoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzJfMF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzJfMF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Mzk5OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjUzOTk6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDA1OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MDU6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMl8wXzMoKTsKQEAgLTE5MTA4LDE0ICsxOTE1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDA4OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDE0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wIDogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDEyOjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MTM6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDE4OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MTk6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzBfX0ltcGwoKTsKQEAgLTE5MTQ2LDIzICsxOTE5MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDIwOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDI2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDI0OjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MjU6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDMwOjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MzE6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDI1OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQyNjoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQzMToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MzI6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRGcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDI3OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDI3OjM6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MzM6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MzM6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCgpOwpAQCAtMTkxOTcsMTQgKzE5MjQzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0MzU6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NDE6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEgOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0Mzk6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ0MDoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NDU6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ0NjoyOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCgpOwpAQCAtMTkyMzAsMjMgKzE5Mjc2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NDY6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8yXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ1MjoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzJfM19fMV9fSW1wbCA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMl8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDUwOjE6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ1MToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ1NjoxOiAoICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NTc6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NTE6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NTI6MjogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ1NzoxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ1ODoyOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDUzOjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NTM6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDU5OjI6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NTk6MzogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZEZ1bGx5UXVhbGlmaWVkTmFtZUFzc2lnbm1lbnRfMl8zXzEoKTsKQEAgLTE5MjgxLDE0ICsxOTMyNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ2MjoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ2ODoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0NjY6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDY3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDcyOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ3MzoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTE5MzE5LDIzICsxOTM2NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ3NDoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDgwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDc4OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDc5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0ODQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0ODU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ3OToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDgwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ4NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDg2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ4MToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0ODE6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ4NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0ODc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTE5MzYwLDE0ICsxOTQwNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ4OToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTQ5NToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU0OTM6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDk0OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NDk5OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTUwMDoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMTkzOTgsMjIgKzE5NDQ0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTAxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ0AnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTA3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ0AnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTUwNToxOiAoICggJ0AnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MDY6MTogKCAnQCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MTE6MTogKCAoICdAJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTEyOjE6ICggJ0AnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTA2OjE6ICggJ0AnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTA3OjI6ICdAJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MTI6MTogKCAnQCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MTM6MjogJ0AnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWVyY2lhbEF0S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0xOTQzOSwxNCArMTk0ODUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MTY6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MjI6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTIwOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTUyMToyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTUyNjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1Mjc6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzcpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC0xOTQ3NywyMyArMTk1MjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1Mjg6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTM0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MzI6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTUzMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1Mzg6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTUzOToxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MzM6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTM0OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTM5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU0MDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MzU6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1MzU6MzogcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU0MToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU0MTozOiBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCk7CkBAIC0xOTUyOCwxNCArMTk1NzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1NDM6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU0OToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU0NzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU0ODoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTUzOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTU0OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTE5NTYxLDMxICsxOTYwNywzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU1NDoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1NjA6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU1ODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTU5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU2NDoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTY1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU1OToxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1NjA6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1NjU6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTY2OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTYxOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTY3OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ2MT0yOwogICAgICAgICAgICAgaW50IExBNjFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTYxXzA9PTc4KSApIHsKKyAgICAgICAgICAgIGlmICggKExBNjFfMD09NzkpICkgewogICAgICAgICAgICAgICAgIGFsdDYxPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1NjE6MzogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1Njc6MzogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAoKTsKQEAgLTE5NjIzLDE0ICsxOTY2OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTcwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTc2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTc0OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1NzU6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTgwOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1ODE6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM4KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsKCk7CkBAIC0xOTY2MSwyNSArMTk3MDcsMjUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU4MjoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCAnKCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU4ODoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCAnKCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU4NjoxOiAoICggKCAnKCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTg3OjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU5MjoxOiAoICggKCAnKCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTkzOjE6ICggKCAnKCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU4NzoxOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1ODg6MjogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU1OTM6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTk0OjI6ICggJygnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU4OToyOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTU4OTozOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTk1OjI6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTk1OjM6ICcoJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICB9CiAKQEAgLTE5NzA4LDE0ICsxOTc1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NTk3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjAzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjAxOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MDI6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjA3OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MDg6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM4KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsKCk7CkBAIC0xOTc0NiwzMSArMTk3OTIsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTYwOToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTYxNToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTYxMzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjE0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTYxOToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjIwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTYxNDoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MTU6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MjA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjIxOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjE2OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjIyOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEgKT8KICAgICAgICAgICAgIGludCBhbHQ2Mj0yOwogICAgICAgICAgICAgaW50IExBNjJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEE2Ml8wPj1SVUxFX0lEICYmIExBNjJfMDw9UlVMRV9TVFJJTkcpfHxMQTYyXzA9PTI3fHwoTEE2Ml8wPj0zNCAmJiBMQTYyXzA8PTM1KXx8TEE2Ml8wPT00MHx8KExBNjJfMD49NDUgJiYgTEE2Ml8wPD01MCl8fExBNjJfMD09NjB8fChMQTYyXzA+PTc3ICYmIExBNjJfMDw9NzgpfHwoTEE2Ml8wPj04MiAmJiBMQTYyXzA8PTgzKXx8TEE2Ml8wPT04Nnx8TEE2Ml8wPT04OHx8KExBNjJfMD49OTEgJiYgTEE2Ml8wPD05OSl8fExBNjJfMD09MTAxfHxMQTYyXzA9PTExMCkgKSB7CisgICAgICAgICAgICBpZiAoICgoTEE2Ml8wPj1SVUxFX0lEICYmIExBNjJfMDw9UlVMRV9TVFJJTkcpfHxMQTYyXzA9PTI3fHwoTEE2Ml8wPj0zNCAmJiBMQTYyXzA8PTM1KXx8TEE2Ml8wPT00MHx8KExBNjJfMD49NDUgJiYgTEE2Ml8wPD01MCl8fExBNjJfMD09NjF8fChMQTYyXzA+PTc4ICYmIExBNjJfMDw9NzkpfHwoTEE2Ml8wPj04MyAmJiBMQTYyXzA8PTg0KXx8TEE2Ml8wPT04N3x8TEE2Ml8wPT04OXx8KExBNjJfMD49OTIgJiYgTEE2Ml8wPD0xMDApfHxMQTYyXzA9PTEwMnx8TEE2Ml8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDYyPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MTY6MzogcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MjI6MzogcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEoKTsKQEAgLTE5ODA4LDE0ICsxOTg1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjI0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjMwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjI4OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2Mjk6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjM0OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2MzU6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwoKTsKQEAgLTE5ODQxLDIyICsxOTg4NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjM1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NDE6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzJfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTYzOToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NDA6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NDU6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjQ2OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjQwOjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjQxOjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NDY6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NDc6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0xOTg4MiwxNCArMTk5MjgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NTE6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NTc6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjU1OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY1NjoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY2MToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NjI6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsKCk7CkBAIC0xOTkyMCwyMyArMTk5NjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NjM6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjY5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2Njc6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY2ODoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NzM6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY3NDoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2Njg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NjY5OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Njc0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY3NToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NzA6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2NzA6MzogcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY3NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY3NjozOiBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCk7CkBAIC0xOTk3MSwxNCArMjAwMTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2Nzg6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY4NDoxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY4MjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY4MzoyOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Njg4OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Njg5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwoKTsKQEAgLTIwMDA0LDM1ICsyMDA1MCwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY4OToxOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2OTU6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY5MzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Njk0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY5OToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzAwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY5NDoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU2OTU6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3MDA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzAxOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Njk2OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzAyOjI6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A2MzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0NjM9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE2M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTYzXzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTYzXzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0NjM9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjMpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTY5NjozOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTcwMjozOiBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAoKTsKQEAgLTIwMDczLDE0ICsyMDExOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzA1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzExOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzA5OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3MTA6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzE1OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3MTY6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwoKTsKQEAgLTIwMTExLDIyICsyMDE1NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzE3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3MjM6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTcyMToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3MjI6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Mjc6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzI4OjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzIyOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzIzOjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Mjg6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Mjk6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIwMTUyLDE0ICsyMDE5OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzMyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzM4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xIDogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzM2OjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Mzc6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzQyOjE6ICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NDM6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwoKTsKQEAgLTIwMTg1LDIzICsyMDIzMSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzQzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NDk6MTogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc0NzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NDg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NTM6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzU0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzQ4OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzQ5OjI6ICggcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NTQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NTU6MjogKCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc1MDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzUwOjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc1NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzU2OjM6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCk7CkBAIC0yMDIzNiwxNCArMjAyODIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzU5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzY1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NjM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NjQ6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc2OToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc3MDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTIwMjc0LDIzICsyMDMyMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NzE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc3NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NzU6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc3NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3ODE6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc4MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3NzY6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Nzc3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1NzgyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc4MzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Nzg6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3Nzg6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc4NDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc4NDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wKCk7CkBAIC0yMDMyNSwxNCArMjAzNzEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Nzg2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc5MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc5MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3OTE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU3OTY6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1Nzk3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjAzNTgsMjMgKzIwNDA0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTc5NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgwMzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODAxOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODAyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4MDc6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4MDg6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgwMjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODAzOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgwODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODA5OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODA0OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgwNDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgxMDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4MTA6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xKCk7CkBAIC0yMDQwOSwxNCArMjA0NTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4MTM6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgxOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgxNzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgxODoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODIzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODI0OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwoKTsKQEAgLTIwNDQyLDIzICsyMDQ4OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgyNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgzMDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4Mjg6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODI5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODM0OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgzNToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgyOToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgzMDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODM1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODM2OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4MzE6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgzMTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4Mzc6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTgzNzozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCgpOwpAQCAtMjA0OTMsMTQgKzIwNTM5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NDA6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NDY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NDQ6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg0NToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NTA6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg1MToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKQEAgLTIwNTMxLDIzICsyMDU3NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODUyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg1ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NTY6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NTc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg2MjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg2MzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODU3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NTg6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODYzOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NjQ6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NTk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODU5OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODY1OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg2NTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKTsKQEAgLTIwNTgyLDE0ICsyMDYyOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODY3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODczOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODcxOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4NzI6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODc3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4Nzg6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwoKTsKQEAgLTIwNjE1LDE3ICsyMDY2MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODc4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAnPScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4ODQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICc9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg4MjoxOiAoICggJz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4ODM6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4ODg6MTogKCAoICc9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODg5OjE6ICggJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODgzOjE6ICggJz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1ODg0OjI6ICc9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4ODk6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4OTA6MjogJz0nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOyAKQEAgLTIwNjU2LDE0ICsyMDcwMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU4OTQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5MDA6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg5ODoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTg5OToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTA0OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTA1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDMpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCgpOwpAQCAtMjA2OTQsMjMgKzIwNzQwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkwNjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTEyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkxMDoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTExOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkxNjoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTE3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkxMToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5MTI6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5MTc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTE4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkxMzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkxMzozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTE5OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTE5OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAoKTsKQEAgLTIwNzQ1LDE0ICsyMDc5MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5MjE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5Mjc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkyNToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkyNjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTMxOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTMyOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDMpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMV9fSW1wbCgpOwpAQCAtMjA3ODMsMzEgKzIwODI5LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkzMzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkzOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTM3OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTM4OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NDM6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NDQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTkzODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTM5OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk0NDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTQ1OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NDA6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTQ2OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0NjQ9MjsKICAgICAgICAgICAgIGludCBMQTY0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBNjRfMD49UlVMRV9JRCAmJiBMQTY0XzA8PVJVTEVfU1RSSU5HKXx8TEE2NF8wPT0yN3x8KExBNjRfMD49MzQgJiYgTEE2NF8wPD0zNSl8fExBNjRfMD09NDB8fChMQTY0XzA+PTQ1ICYmIExBNjRfMDw9NTApfHxMQTY0XzA9PTYwfHwoTEE2NF8wPj03NyAmJiBMQTY0XzA8PTc4KXx8KExBNjRfMD49ODIgJiYgTEE2NF8wPD04Myl8fExBNjRfMD09ODZ8fExBNjRfMD09ODh8fChMQTY0XzA+PTkxICYmIExBNjRfMDw9OTkpfHxMQTY0XzA9PTEwMXx8TEE2NF8wPT0xMTApICkgeworICAgICAgICAgICAgaWYgKCAoKExBNjRfMD49UlVMRV9JRCAmJiBMQTY0XzA8PVJVTEVfU1RSSU5HKXx8TEE2NF8wPT0yN3x8KExBNjRfMD49MzQgJiYgTEE2NF8wPD0zNSl8fExBNjRfMD09NDB8fChMQTY0XzA+PTQ1ICYmIExBNjRfMDw9NTApfHxMQTY0XzA9PTYxfHwoTEE2NF8wPj03OCAmJiBMQTY0XzA8PTc5KXx8KExBNjRfMD49ODMgJiYgTEE2NF8wPD04NCl8fExBNjRfMD09ODd8fExBNjRfMD09ODl8fChMQTY0XzA+PTkyICYmIExBNjRfMDw9MTAwKXx8TEE2NF8wPT0xMDJ8fExBNjRfMD09MTExKSApIHsKICAgICAgICAgICAgICAgICBhbHQ2ND0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ2NCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTQwOjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk0NjozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wKCk7CkBAIC0yMDg0NSwxNCArMjA4OTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTQ4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzIgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk1NDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk1MjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NTM6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NTg6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTU5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCgpOwpAQCAtMjA4NzgsMjIgKzIwOTI0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk1OToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsIDogKCAnXScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NjU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbCA6ICggJ10nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NjM6MTogKCAoICddJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTY0OjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTY5OjE6ICggKCAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk3MDoxOiAoICddJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk2NDoxOiAoICddJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk2NToyOiAnXScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTcwOjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTcxOjI6ICddJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMDkxOSwxNCArMjA5NjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5NzU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk4MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk3OToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk4MDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTg1OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTg2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKQEAgLTIwOTUyLDIzICsyMDk5OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk4NjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk5MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5OTA6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTkxOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTk2OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk5NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk5MToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk5MjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTk3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo1OTk4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5OTM6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk5MzozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjU5OTk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NTk5OTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMCgpOwpAQCAtMjEwMDMsMTQgKzIxMDQ5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMDI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMDg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMDY6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAwNzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMTI6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAxMzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDQpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwoKTsKQEAgLTIxMDQxLDIzICsyMTA4NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDE0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAyMDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMTg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAyNDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAyNToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDE5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMjA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDI1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMjY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDIxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAyMTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDI3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAyNzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjEwODIsMTQgKzIxMTI4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMjk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMzU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMzM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjAzNDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwMzk6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA0MDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDUpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwoKTsKQEAgLTIxMTIwLDIyICsyMTE2NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDQxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsIDogKCAnIycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwNDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwgOiAoICcjJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA0NToxOiAoICggJyMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwNDY6MTogKCAnIycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwNTE6MTogKCAoICcjJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDUyOjE6ICggJyMnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDQ2OjE6ICggJyMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDQ3OjI6ICcjJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwNTI6MTogKCAnIycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwNTM6MjogJyMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMTE2MSwxNCArMjEyMDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA1NjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA2MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA2MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDYxOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA2NjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDY3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsKCk7CkBAIC0yMTE5NCwyMiArMjEyNDAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA2NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbCA6ICggJ1snICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDczOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yX19JbXBsIDogKCAnWycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwNzE6MTogKCAoICdbJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDcyOjE6ICggJ1snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDc3OjE6ICggKCAnWycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA3ODoxOiAoICdbJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA3MjoxOiAoICdbJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA3MzoyOiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDc4OjE6ICggJ1snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDc5OjI6ICdbJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMTIzNSwxNCArMjEyODEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwODM6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwODk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MDg3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA4ODoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjA5MzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwOTQ6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsKCk7CkBAIC0yMTI3MywyMyArMjEzMTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwOTU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTAxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYwOTk6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEwMDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMDU6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEwNjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMDA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTAxOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTA2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEwNzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMDI6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMDI6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEwODoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEwODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCk7CkBAIC0yMTMyNCwxNCArMjEzNzAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMTA6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjExNjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjExNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjExNToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTIwOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTIxOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwoKTsKQEAgLTIxMzU3LDM1ICsyMTQwMywzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMjc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEyNToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTI2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEzMToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTMyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEyNjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMjc6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxMzI6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTMzOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTI4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTM0OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A2NToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0NjU9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE2NV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTY1XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTY1XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0NjU9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjUpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEyODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjEzNDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAoKTsKQEAgLTIxNDI2LDE0ICsyMTQ3MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTM3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTQzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTQxOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxNDI6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTQ3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxNDg6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsKCk7CkBAIC0yMTQ2NCwyMiArMjE1MTAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE0OToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTU1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxNTM6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTU0OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTU5OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE2MDoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE1NDoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE1NToyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTYwOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTYxOjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0yMTUwNSwxNCArMjE1NTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE2NDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE3MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE2ODoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTY5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE3NDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTc1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsKCk7CkBAIC0yMTUzOCwyMyArMjE1ODQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE3NToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTgxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxNzk6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTgwOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTg1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE4NjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE4MDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE4MToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTg2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTg3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxODI6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE4MjozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYxODg6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE4ODozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpOwpAQCAtMjE1ODksMTQgKzIxNjM1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE5MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjE5NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTk1OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MTk2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMDE6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMDI6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsKCk7CkBAIC0yMTYyNywxNyArMjE2NzMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjAzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIwOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsIDogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIwNzoxOiAoICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMDg6MTogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMTM6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjE0OjE6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjA4OjE6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjA5OjI6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMTQ6MTogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMTU6MjogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC0yMTY3MiwxNCArMjE3MTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjE4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIyNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIyMjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMjM6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMjg6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjI5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMjE3MDUsMzEgKzIxNzUxLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIyOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIzNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjMzOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjM0OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMzk6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNDA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjIzNDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjM1OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI0MDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjQxOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyMzY6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjQyOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0NjY9MjsKICAgICAgICAgICAgIGludCBMQTY2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE2Nl8wPT04MCkgKSB7CisgICAgICAgICAgICBpZiAoIChMQTY2XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICBhbHQ2Nj0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ2NikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjM2OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI0MjozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wKCk7CkBAIC0yMTc2NywxNCArMjE4MTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNDU6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNTE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjQ5OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI1MDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI1NToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNTY6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsKCk7CkBAIC0yMTgwNSwyMyArMjE4NTEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNTc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI2MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI2MToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI2MjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjY3OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjY4OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNjI6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI2MzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNjg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI2OToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNjQ6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjY0OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNzA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjcwOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yMTg0NiwxNCArMjE4OTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyNzI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI3ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI3NjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI3NzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjgyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjgzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwoKTsKQEAgLTIxODc5LDI2ICsyMTkyNSwyNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI4MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwgOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyODk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSApICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI4NzoxOiAoICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKSAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjg4OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKSAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI5MzoxOiAoICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKSAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjk0OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKSAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI4ODoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyODk6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKSAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyOTQ6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSApICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjk1OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjg5OjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjkwOjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyOTU6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyOTY6MzogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI5MTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MjkxOjQ6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI5NzozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjk3OjQ6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCgpOwpAQCAtMjE5MTQsMjYgKzIxOTYwLDI2IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyOTQ6MjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mjk1OjM6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzAwOjI6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMwMTozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjI5NjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMwMjozOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wICkqCiAgICAgICAgICAgICBsb29wNjc6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDY3PTI7CiAgICAgICAgICAgICAgICAgaW50IExBNjdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE2N18wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE2N18wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDY3PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDY3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYyOTY6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMDI6NDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wKCk7CkBAIC0yMTk3NywxNCArMjIwMjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMwNjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMxMjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMxMDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzExOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMxNjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzE3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbCgpOwpAQCAtMjIwMTUsMjIgKzIyMDYxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMTg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMyNDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzIyOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMyMzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMyODoxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMjk6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMjM6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMjQ6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMyOToxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMzMDoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjIwNTYsMTQgKzIyMTAyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMzM6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMzk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzMzc6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjMzODoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNDM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM0NDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCgpOwpAQCAtMjIwODksMjMgKzIyMTM1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNDQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM1MDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzQ4OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM0OToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM1NDoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNTU6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNDk6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNTA6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM1NToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM1NjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzUxOjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNTE6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzU3OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNTc6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKTsKQEAgLTIyMTQwLDE0ICsyMjE4NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzYwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzY2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzY0OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNjU6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzcwOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNzE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQzKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsKCk7CkBAIC0yMjE3OCwyMyArMjIyMjQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM3MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzNzg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzc2OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzc3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzODI6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzODM6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM3NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzc4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM4MzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzg0OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzc5OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM3OTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM4NToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzODU6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wKCk7CkBAIC0yMjIyOSwxNCArMjIyNzUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM4NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM5MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM5MToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2MzkyOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjM5NzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Mzk4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Myk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbCgpOwpAQCAtMjIyNjcsMzEgKzIyMzEzLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjYzOTk6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQwNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDAzOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQwNDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQwOToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MTA6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MDQ6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MDU6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQxMDoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQxMToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MDY6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQxMjoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ2OD0yOwogICAgICAgICAgICAgaW50IExBNjhfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEE2OF8wPj1SVUxFX0lEICYmIExBNjhfMDw9UlVMRV9TVFJJTkcpfHxMQTY4XzA9PTI3fHwoTEE2OF8wPj0zNCAmJiBMQTY4XzA8PTM1KXx8TEE2OF8wPT00MHx8KExBNjhfMD49NDUgJiYgTEE2OF8wPD01MCl8fExBNjhfMD09NjB8fChMQTY4XzA+PTc3ICYmIExBNjhfMDw9NzgpfHwoTEE2OF8wPj04MiAmJiBMQTY4XzA8PTgzKXx8TEE2OF8wPT04Nnx8TEE2OF8wPT04OHx8KExBNjhfMD49OTEgJiYgTEE2OF8wPD05OSl8fExBNjhfMD09MTAxfHxMQTY4XzA9PTExMCkgKSB7CisgICAgICAgICAgICBpZiAoICgoTEE2OF8wPj1SVUxFX0lEICYmIExBNjhfMDw9UlVMRV9TVFJJTkcpfHxMQTY4XzA9PTI3fHwoTEE2OF8wPj0zNCAmJiBMQTY4XzA8PTM1KXx8TEE2OF8wPT00MHx8KExBNjhfMD49NDUgJiYgTEE2OF8wPD01MCl8fExBNjhfMD09NjF8fChMQTY4XzA+PTc4ICYmIExBNjhfMDw9NzkpfHwoTEE2OF8wPj04MyAmJiBMQTY4XzA8PTg0KXx8TEE2OF8wPT04N3x8TEE2OF8wPT04OXx8KExBNjhfMD49OTIgJiYgTEE2OF8wPD0xMDApfHxMQTY4XzA9PTEwMnx8TEE2OF8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDY4PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDY4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MDY6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQxMjozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAoKTsKQEAgLTIyMzI5LDE0ICsyMjM3NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDE0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDIwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDE4OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MTk6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDI0OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MjU6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwoKTsKQEAgLTIyMzYyLDIyICsyMjQwOCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDI1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsIDogKCAnXScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MzE6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwgOiAoICddJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQyOToxOiAoICggJ10nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MzA6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MzU6MTogKCAoICddJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDM2OjE6ICggJ10nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDMwOjE6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDMxOjI6ICddJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0MzY6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0Mzc6MjogJ10nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjI0MDMsMTQgKzIyNDQ5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ0MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NDU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDQ2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDUxOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ1MjoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKQEAgLTIyNDM2LDIzICsyMjQ4MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NTI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ1ODoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NTY6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ1NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NjI6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ2MzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NTc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDU4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDYzOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ2NDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NTk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NTk6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ2NToyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ2NTozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wKCk7CkBAIC0yMjQ4NywxNCArMjI1MzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0Njg6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0NzQ6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDcyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ3MzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ3ODoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0Nzk6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDQpOwogICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsKCk7CkBAIC0yMjUyNSwyMyArMjI1NzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0ODA6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ4NjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ4NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ4NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDkwOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDkxOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0ODU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ4NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY0OTE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ5MjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDg3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ4NzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDkzOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ5MzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjI1NjYsMTQgKzIyNjEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NDk1OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTAxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjQ5OToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MDA6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MDU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTA2OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ1KTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCgpOwpAQCAtMjI2MDQsMjIgKzIyNjUwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTA3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCA6ICggJyMnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTEzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCA6ICggJyMnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjUxMToxOiAoICggJyMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MTI6MTogKCAnIycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MTc6MTogKCAoICcjJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTE4OjE6ICggJyMnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTEyOjE6ICggJyMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTEzOjI6ICcjJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MTg6MTogKCAnIycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MTk6MjogJyMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIyNjQ1LDE0ICsyMjY5MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjUyMjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTI4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMiA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTI2OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTI3OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MzI6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1MzM6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCgpOwpAQCAtMjI2NzgsMjIgKzIyNzI0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTMzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCA6ICggJ1snICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTM5OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCA6ICggJ1snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjUzNzoxOiAoICggJ1snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1Mzg6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NDM6MTogKCAoICdbJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTQ0OjE6ICggJ1snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTM4OjE6ICggJ1snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTM5OjI6ICdbJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NDQ6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NDU6MjogJ1snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMjI3MTksMTQgKzIyNzY1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU0OToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU1NToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wIDogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTUzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTU0OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NTk6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NjA6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsKCk7CkBAIC0yMjc1NywyMyArMjI4MDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTYxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTY3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NjU6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NjY6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU3MToxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU3MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTY2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1Njc6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTcyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NzM6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1Njg6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTY4OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTc0OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU3NDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKTsKQEAgLTIyODA4LDE0ICsyMjg1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1NzY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTgyOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTgwOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU4MToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU4NjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1ODc6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsKCk7CkBAIC0yMjg0MSwzNSArMjI4ODcsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTg3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTkzOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1OTE6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1OTI6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU5NzoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU5ODoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTkyOjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1OTM6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NTk4OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY1OTk6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU5NDoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2MDA6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A2OToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0Njk9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE2OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTY5XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTY5XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0Njk9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjkpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjU5NDozOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2MDA6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAoKTsKQEAgLTIyOTEwLDE0ICsyMjk1NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYwMzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYwOToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2MDc6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjA4OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjEzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYxNDoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwoKTsKQEAgLTIyOTQ4LDIyICsyMjk5NCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYxNToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYyMToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2MTk6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjIwOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjI1OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYyNjoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYyMDoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYyMToyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjI2OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjI3OjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTIyOTg5LDE0ICsyMzAzNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjYzMDoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEgOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjM2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMSA6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjM0OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjM1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NDA6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NDE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpOwpAQCAtMjMwMjIsMjMgKzIzMDY4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjQxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY0NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjQ1OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NDY6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjUxOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NTI6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjQ2OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY0NzoyOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY1MjoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NTM6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjQ4OjI6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjQ4OjM6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NTQ6MjogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NTQ6MzogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpOwpAQCAtMjMwNzMsMTQgKzIzMTE5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NTc6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NjM6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NjE6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY2MjoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2Njc6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY2ODoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDYpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwoKTsKQEAgLTIzMTExLDIzICsyMzE1NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjY5OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY3NToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NzM6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NzQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY3OToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY4MDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Njc0OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NzU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjgwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2ODE6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFjdGlvbl8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2NzY6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Njc2OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2ODI6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NjgyOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yMzE1MiwxNCArMjMxOTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY4NDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY5MDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY4ODoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Njg5OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjY5NDoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Njk1OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Mik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbCgpOwpAQCAtMjMxOTAsMjMgKzIzMjM2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY2OTY6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzAyOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcwMDoxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcwMToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzA2OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzA3OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MDE6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcwMjoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MDc6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcwODoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcwMzoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MDM6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MDk6MjogKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzA5OjM6IHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSgpOwpAQCAtMjMyNDEsMTQgKzIzMjg3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MTE6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzIgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MTc6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzIgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MTU6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcxNjoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MjE6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcyMjoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzJfX0ltcGwoKTsKQEAgLTIzMjc5LDE3ICsyMzMyNSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzIzOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsIDogKCBydWxlT3BTaW5nbGVBc3NpZ24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3Mjk6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzJfX0ltcGwgOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjcyNzoxOiAoICggcnVsZU9wU2luZ2xlQXNzaWduICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3Mjg6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MzM6MTogKCAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzM0OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzI4OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzI5OjI6IHJ1bGVPcFNpbmdsZUFzc2lnbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MzQ6MTogKCBydWxlT3BTaW5nbGVBc3NpZ24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3MzU6MjogcnVsZU9wU2luZ2xlQXNzaWduCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IApAQCAtMjMzMjQsMTQgKzIzMzcwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3Mzg6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzMgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NDQ6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzMgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NDI6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc0MzoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NDg6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc0OToyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCgpOwpAQCAtMjMzNTcsMjMgKzIzNDAzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NDk6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc1NToxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fM19fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzUzOjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc1NDoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc1OToxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NjA6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NTQ6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NTU6MjogKCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc2MDoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc2MToyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19WYWx1ZUFzc2lnbm1lbnRfMF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzU2OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NTY6MzogcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzYyOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NjI6MzogcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMoKTsKQEAgLTIzNDA4LDE0ICsyMzQ1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzY1OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzcxOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzY5OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NzA6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Nzc1OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3NzY6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ3KTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsKCk7CkBAIC0yMzQ0NiwxNyArMjM0OTIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc3NzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbCA6ICggcnVsZVhPckV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3ODM6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwgOiAoIHJ1bGVYT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzgxOjE6ICggKCBydWxlWE9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzgyOjE6ICggcnVsZVhPckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3ODc6MTogKCAoIHJ1bGVYT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY3ODg6MTogKCBydWxlWE9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc4MjoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2NzgzOjI6IHJ1bGVYT3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc4ODoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Nzg5OjI6IHJ1bGVYT3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC0yMzQ5MSwxNCArMjM1MzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc5MjoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc5ODoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njc5NjoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2Nzk3OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgwMjoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODAzOjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0yMzUyNCwyNyArMjM1NzAsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgwMzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODA5OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MDc6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODA4OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODEzOjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgxNDoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgwODoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgwOToyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODE0OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODE1OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgxMDoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODE2OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPwogICAgICAgICAgICAgaW50IGFsdDcwPTI7CiAgICAgICAgICAgICBhbHQ3MCA9IGRmYTcwLnByZWRpY3QoaW5wdXQpOwogICAgICAgICAgICAgc3dpdGNoIChhbHQ3MCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODEwOjM6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MTY6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wKCk7CkBAIC0yMzU4MiwxNCArMjM2MjgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODE5OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODI1OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MjM6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MjQ6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgyOToxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgzMDoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwoKTsKQEAgLTIzNjIwLDIzICsyMzY2NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MzE6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgzNzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MzU6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgzNjoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NDE6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg0MjoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4MzY6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODM3OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODQyOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg0MzoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4Mzg6MjogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4Mzg6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg0NDoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg0NDozOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wKCk7CkBAIC0yMzY3MSwxNCArMjM3MTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODQ2OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEgOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg1MjoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg1MDoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NTE6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NTY6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODU3OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCgpOwpAQCAtMjM3MDQsMjMgKzIzNzUwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg1NzoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NjM6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NjE6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODYyOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODY3OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg2ODoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg2MjoxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg2MzoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODY4OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODY5OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NjQ6MjogKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg2NDozOiBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4NzA6MjogKCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg3MDozOiBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpOwpAQCAtMjM3NTUsMTQgKzIzODAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODczOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCA6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4Nzk6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4Nzc6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4Nzg6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg4MzoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg4NDoyOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsKCk7CkBAIC0yMzc4OCwyMyArMjM4MzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4ODQ6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4OTA6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODg4OjE6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg4OToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg5NDoxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4OTU6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4ODk6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4OTA6MjogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg5NToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njg5NjoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODkxOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4OTE6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODk3OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY4OTc6MzogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAoKTsKQEAgLTIzODM5LDE0ICsyMzg4NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTAwOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTA2OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTA0OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MDU6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTEwOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MTE6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ3KTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCk7CkBAIC0yMzg3NywyMyArMjM5MjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjkxMjoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MTg6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTE2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTE3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MjI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MjM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjkxNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTE4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjkyMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTI0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjkxOToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MTk6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjkyNToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MjU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTIzOTE4LDE0ICsyMzk2NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTI3OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTMzOjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xIDogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTMxOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5MzI6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTM3OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5Mzg6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTIzOTUxLDIzICsyMzk5NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTM4OjE6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk0NDoxOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NDI6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NDM6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk0ODoxOiAoICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk0OToxOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTQzOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NDQ6MjogKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTQ5OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NTA6MjogKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NDU6MjogKCBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTQ1OjM6IHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTUxOjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk1MTozOiBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKTsKQEAgLTI0MDAyLDE0ICsyNDA0OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NTQ6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NjA6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk1ODoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk1OToyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTY0OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTY1OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDgpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCgpOwpAQCAtMjQwNDAsMTcgKzI0MDg2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk2NjoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18wX19JbXBsIDogKCAnPCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NzI6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbCA6ICggJzwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5NzA6MTogKCAoICc8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTcxOjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTc2OjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk3NzoxOiAoICc8JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk3MToxOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk3MjoyOiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTc3OjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTc4OjI6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7IApAQCAtMjQwODEsMTQgKzI0MTI3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk4MToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk4NzoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTg1OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTg2OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5OTE6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5OTI6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180Mik7CiAgICAgICAgICAgICBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsKCk7CkBAIC0yNDExOSwxNyArMjQxNjUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTkzOjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzFfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk5OToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Njk5NzoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjY5OTg6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMDM6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDA0OjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTk4OjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2OTk5OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMDQ6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMDU6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMSgpKTsgCkBAIC0yNDE2MCwxNCArMjQyMDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDA4OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIgOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAxNDoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAxMjoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMTM6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMTg6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDE5OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCgpOwpAQCAtMjQxOTMsMTcgKzI0MjM5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAxOToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsIDogKCAnPScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMjU6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbCA6ICggJz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMjM6MTogKCAoICc9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDI0OjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDI5OjE6ICggKCAnPScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAzMDoxOiAoICc9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAyNDoxOiAoICc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAyNToyOiAnPScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDMwOjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDMxOjI6ICc9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfNV8yKCkpOyAKQEAgLTI0MjM0LDE0ICsyNDI4MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwMzU6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNDE6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCA6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzAzOToxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA0MDoyOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDQ1OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDQ2OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDkpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCgpOwpAQCAtMjQyNzIsMTcgKzI0MzE4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA0NzoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNTM6MTogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMF9fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNTE6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDUyOjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDU3OjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA1ODoxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA1MjoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA1MzoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDU4OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDU5OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IApAQCAtMjQzMTMsMTQgKzI0MzU5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA2MjoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA2ODoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDY2OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDY3OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNzI6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNzM6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180OSk7CiAgICAgICAgICAgICBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsKCk7CkBAIC0yNDM1MSwyMiArMjQzOTcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDc0OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwgOiAoICggJz4nICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDgwOjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwgOiAoICggJz4nICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNzg6MTogKCAoICggJz4nICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwNzk6MTogKCAoICc+JyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA4NDoxOiAoICggKCAnPicgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA4NToxOiAoICggJz4nICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDc5OjE6ICggKCAnPicgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwODA6MjogKCAnPicgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDg1OjE6ICggKCAnPicgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwODY6MjogKCAnPicgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDgxOjI6ICggJz4nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA4NzoyOiAoICc+JyApPwogICAgICAgICAgICAgaW50IGFsdDcxPTI7CiAgICAgICAgICAgICBpbnQgTEE3MV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTI0Mzc1LDcgKzI0NDIxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzEpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA4MTozOiAnPicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwODc6MzogJz4nCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC0yNDQwOSwxNCArMjQ0NTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MDg5OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIgOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA5NToxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yIDogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzA5MzoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwOTQ6MjogcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcwOTk6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTAwOjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCgpOwpAQCAtMjQ0NDIsMTcgKzI0NDg4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEwMDoxOiBydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsIDogKCAnPj0nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTA2OjE6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwgOiAoICc+PScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEwNDoxOiAoICggJz49JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTA1OjE6ICggJz49JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzExMDoxOiAoICggJz49JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTExOjE6ICggJz49JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEwNToxOiAoICc+PScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxMDY6MjogJz49JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxMTE6MTogKCAnPj0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTEyOjI6ICc+PScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgCkBAIC0yNDQ4MywxNCArMjQ1MjksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzExNjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEyMjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEyMDoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTIxOjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEyNjoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTI3OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181MCk7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMjQ1MjEsMTcgKzI0NTY3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxMjg6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEzNDoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhBbmRFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTMyOjE6ICggKCBydWxlWEFuZEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEzMzoxOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEzODoxOiAoICggcnVsZVhBbmRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxMzk6MTogKCBydWxlWEFuZEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxMzM6MTogKCBydWxlWEFuZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxMzQ6MjogcnVsZVhBbmRFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzEzOToxOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE0MDoyOiBydWxlWEFuZEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0yNDU2NiwxNCArMjQ2MTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE0MzoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE0OToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE0NzoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTQ4OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE1MzoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTU0OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0yNDU5OSwyMiArMjQ2NDUsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE1NDoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTYwOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxNTg6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTU5OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTY0OjE6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE2NToxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE1OToxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE2MDoyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTY1OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTY2OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE2MToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTY3OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgbG9vcDcyOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ3Mj0yOwpAQCAtMjQ2MjMsNyArMjQ2NjksNyBAQAogICAgICAgICAgICAgICAgIGlmICggKExBNzJfMD09MTQpICkgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Ml8yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyMF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIxX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3Mj0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTI0NjMzLDcgKzI0Njc5LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzIpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE2MTozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTY3OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV181MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKTsKQEAgLTI0Njc0LDE0ICsyNDcyMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxNzA6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxNzY6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE3NDoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE3NToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTgwOjE6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTgxOjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMjQ3MTIsMjMgKzI0NzU4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE4MjoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTg4OjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE4NjoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTg3OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE5MjoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTkzOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE4NzoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxODg6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxOTM6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTk0OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE4OToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzE4OTozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTk1OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTk1OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTI0NzYzLDE0ICsyNDgwOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxOTc6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjAzOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjAxOjE6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIwMjoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIwNzoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMDg6MjogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0yNDc5NiwyMyArMjQ4NDIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjA4OjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIxNDoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIxMjoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMTM6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMTg6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjE5OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjEzOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjE0OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMTk6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMjA6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIxNToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjE1OjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIyMToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjIxOjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCk7CkBAIC0yNDg0NywxNCArMjQ4OTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMjQ6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIzMDoxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIyODoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIyOToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjM0OjE6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjM1OjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTI0ODgwLDIzICsyNDkyNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzIzNToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI0MToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyMzk6MTogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjQwOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjQ1OjE6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI0NjoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI0MDoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI0MToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjQ2OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjQ3OjI6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNDI6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI0MjozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNDg6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI0ODozOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpOwpAQCAtMjQ5MzEsMTQgKzI0OTc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNTE6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNTc6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNTU6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI1NjoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNjE6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI2MjoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTApOwogICAgICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTI0OTY5LDIzICsyNTAxNSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjYzOjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI2OToxOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNjc6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNjg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI3MzoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI3NDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjY4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNjk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mjc0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNzU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MjcwOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI3MDozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mjc2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI3NjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjUwMTAsMTQgKzI1MDU2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyNzg6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyODQ6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyODI6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI4MzoyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyODg6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI4OToyOiBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtMjUwNDMsMjMgKzI1MDg5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyODk6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mjk1OjE6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI5MzoxOiAoICggKCBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI5NDoxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mjk5OjE6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzAwOjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyOTQ6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI5NToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMDA6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMwMToyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzI5NjoyOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcyOTY6MzogcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMDI6MjogKCBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzAyOjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpOwpAQCAtMjUwOTQsMTQgKzI1MTQwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzA1OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzExOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMwOToxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMTA6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMTU6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzE2OjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzUyKTsKICAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMjUxMzIsMTcgKzI1MTc4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzE3OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMjM6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMjE6MTogKCAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMjI6MTogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMyNzoxOiAoICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMyODoxOiAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzIyOjE6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMjM6MjogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzI4OjE6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMjk6MjogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0yNTE3NywxNCArMjUyMjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczMzI6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMzODoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMzNjoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzMzNzoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzQyOjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzQzOjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTI1MjEwLDIyICsyNTI1NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM0MzoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNDk6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM0NzoxOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzQ4OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM1MzoxOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzU0OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM0ODoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNDk6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNTQ6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzU1OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzUwOjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzU2OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A3MzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0NzM9MjsKQEAgLTI1MjM0LDcgKzI1MjgwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAoIChMQTczXzA9PTE1KSApIHsKICAgICAgICAgICAgICAgICAgICAgaW50IExBNzNfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjFfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyMl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWx0NzM9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yNTI0NCw3ICsyNTI5MCw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDczKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNTA6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNTY6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV181Myk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CkBAIC0yNTI4NSwxNCArMjUzMzEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM1OToxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM2NToxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM2MzoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzY0OjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM2OToxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzcwOjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMjUzMjMsMjMgKzI1MzY5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNzE6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mzc3OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM3NToxOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM3NjoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzgxOjE6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MzgyOjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNzY6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM3NzoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczODI6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM4MzoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM3ODoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNzg6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczODQ6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Mzg0OjM6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpOwpAQCAtMjUzNzQsMTQgKzI1NDIwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczODY6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczOTI6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczOTA6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM5MToyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczOTY6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM5NzoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMjU0MDcsMjMgKzI1NDUzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczOTc6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MDM6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MDE6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQwMjoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MDc6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQwODoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MDI6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDAzOjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDA4OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQwOToyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MDQ6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MDQ6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQxMDoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQxMDozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCk7CkBAIC0yNTQ1OCwxNCArMjU1MDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDEzOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQxOToxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQxNzoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MTg6MjogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MjM6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDI0OjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpOwpAQCAtMjU0OTEsMjMgKzI1NTM3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQyNDoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDMwOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQyODoxOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDI5OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQzNDoxOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDM1OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQyOToxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MzA6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0MzU6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDM2OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQzMToyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQzMTozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDM3OjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDM3OjM6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKTsKQEAgLTI1NTQyLDE0ICsyNTU4OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ0MDoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ0NjoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0NDQ6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDQ1OjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDUwOjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ1MToyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Mik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTI1NTgwLDIzICsyNTYyNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ1MjoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDU4OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDU2OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDU3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0NjI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0NjM6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ1NzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDU4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ2MzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDY0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0NTk6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDU5OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0NjU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDY1OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yNTYyMSwxNCArMjU2NjcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0Njc6MTogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ3MzoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ3MToxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ3MjoyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDc3OjE6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDc4OjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTI1NjU0LDIzICsyNTcwMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ3ODoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ4NDoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0ODI6MTogKCAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDgzOjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDg4OjE6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ4OToxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ4MzoxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ4NDoyOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDg5OjE6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NDkwOjI6ICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0ODU6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ4NTozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0OTE6MjogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ5MTozOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpOwpAQCAtMjU3MDUsMTQgKzI1NzUxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0OTQ6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1MDA6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc0OTg6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzQ5OToyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1MDQ6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUwNToyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTQpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTI1NzQzLDE3ICsyNTc4OSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTA2OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTEyOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTEwOjE6ICggKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1MTE6MTogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTE2OjE6ICggKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1MTc6MTogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTExOjE6ICggcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUxMjoyOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUxNzoxOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1MTg6MjogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0yNTc4OCwxNCArMjU4MzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUyMToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUyNzoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUyNToxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTI2OjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUzMToxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTMyOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0yNTgyMSwyMiArMjU4NjcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUzMjoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTM4OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1MzY6MTogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTM3OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTQyOjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU0MzoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUzNzoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUzODoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTQzOjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTQ0OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzUzOToyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTQ1OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgbG9vcDc0OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ3ND0yOwpAQCAtMjU4NDUsNyArMjU4OTEsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc0XzIgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIyX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjNfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc0PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjU4NTYsNyArMjU5MDIsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc0XzMgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIyX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjNfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc0PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjU4NjcsNyArMjU5MTMsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc0XzQgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIyX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjNfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc0PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjU4NzgsNyArMjU5MjQsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc0XzUgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIyX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjNfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc0PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjU4OTAsNyArMjU5MzYsNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3NCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTM5OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NDU6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzU1KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwpAQCAtMjU5MzEsMTQgKzI1OTc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU0ODoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU1NDoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTUyOjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTUzOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NTg6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NTk6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCk7CkBAIC0yNTk2OSwyMyArMjYwMTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTYwOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NjY6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTY0OjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NjU6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTcwOjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NzE6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTY1OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU2NjoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU3MToxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NzI6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTY3OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTY3OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NzM6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NzM6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpOwpAQCAtMjYwMjAsMTQgKzI2MDY2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU3NToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xIDogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1ODE6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1Nzk6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTgwOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTg1OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU4NjoyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKTsKQEAgLTI2MDUzLDIzICsyNjA5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1ODY6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTkyOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTkwOjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU5MToxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU5NjoxOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1OTc6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1OTE6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1OTI6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU5NzoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzU5ODoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTkzOjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1OTM6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NTk5OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1OTk6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKTsKQEAgLTI2MTA0LDE0ICsyNjE1MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYwMjoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjA4OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjA2OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjA3OjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MTI6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MTM6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpOwpAQCAtMjYxMzcsMjMgKzI2MTgzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjEzOjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjE5OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYxNzoxOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MTg6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MjM6MTogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjI0OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjE4OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjE5OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MjQ6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MjU6MjogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYyMDoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjIwOjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYyNjoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjI2OjM6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCk7CkBAIC0yNjE4OCwxNCArMjYyMzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYyOToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYzNToxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYzMzoxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjM0OjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYzOToxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjQwOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181NCk7CiAgICAgICAgICAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpOwpAQCAtMjYyMjYsMjMgKzI2MjcyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NDE6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjQ3OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0NToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0NjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjUxOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjUyOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NDY6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NTI6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY1MzoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NDg6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjQ4OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NTQ6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjU0OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yNjI2NywxNCArMjYzMTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY1NjoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY2MjoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY2MDoxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjYxOjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY2NjoxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjY3OjI6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCk7CkBAIC0yNjMwMCwyMyArMjYzNDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY2NzoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NzM6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjcxOjE6ICggKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjcyOjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2Nzc6MTogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2Nzg6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY3MjoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjczOjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY3ODoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njc5OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njc0OjI6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY3NDozOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY4MDoyOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2ODA6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCk7CkBAIC0yNjM1MSwxNCArMjYzOTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjgzOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njg5OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2ODc6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2ODg6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5MzoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5NDoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU2KTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTI2Mzg5LDE3ICsyNjQzNSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTU6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTk6MTogKCAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoxOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDU6MTogKCAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNjoxOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MTogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAxOjI6IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA2OjE6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNzoyOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMjY0MzQsMTQgKzI2NDgwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMDoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTY6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTQ6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzE1OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzIwOjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcyMToyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTI2NDY3LDIyICsyNjUxMywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MjE6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzI3OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzI1OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcyNjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzczMToxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MzI6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MjY6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3Mjc6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzczMjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzczMzoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3Mjg6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzczNDoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKSoKICAgICAgICAgICAgIGxvb3A3NToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0NzU9MjsKQEAgLTI2NDkxLDcgKzI2NTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE3NV8yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyM19JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI0X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3NT0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTI2NTAyLDE4ICsyNjU0OCwxOCBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc1XzMgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIzX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc1PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc1XzQgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIzX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc1PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjY1MjQsNyArMjY1NzAsNyBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTc1XzUgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTIzX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc1PTE7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjY1MzYsNyArMjY1ODIsNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3NSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzI4OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MzQ6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzU3KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSgpOwpAQCAtMjY1NzcsMTQgKzI2NjIzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3Mzc6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NDM6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NDE6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc0MjoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NDc6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc0ODoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTI2NjE1LDIzICsyNjY2MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzQ5OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc1NToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NTM6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NTQ6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc1OToxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc2MDoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzU0OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NTU6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzYwOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NjE6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NTY6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzU2OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzYyOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc2MjozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKTsKQEAgLTI2NjY2LDE0ICsyNjcxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzY0OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzcwOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzY4OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3Njk6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzc0OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3NzU6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwoKTsKQEAgLTI2Njk5LDIzICsyNjc0NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzc1OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc4MToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3Nzk6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3ODA6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc4NToxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc4NjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzgwOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3ODE6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzg2OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3ODc6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMV8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3ODI6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzgyOjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzg4OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc4ODozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEoKTsKQEAgLTI2NzUwLDE0ICsyNjc5NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3OTE6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzk3OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Nzk1OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzc5NjoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzgwMToxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MDI6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CkBAIC0yNjc4MywyMyArMjY4MjksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODAyOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MDg6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODA2OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MDc6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODEyOjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MTM6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODA3OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzgwODoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzgxMzoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MTQ6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODA5OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODA5OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MTU6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MTU6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCgpOwpAQCAtMjY4MzQsMTQgKzI2ODgwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODE4OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODI0OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzgyMjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MjM6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4Mjg6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODI5OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU5KTsKICAgICAgICAgICAgIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCgpOwpAQCAtMjY4NzIsMjMgKzI2OTE4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODMwOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MzY6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MzQ6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MzU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg0MDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg0MToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODM1OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4MzY6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODQxOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4NDI6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4Mzc6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODM3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4NDM6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODQzOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yNjkxMywxNCArMjY5NTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4NDU6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg1MToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg0OToxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg1MDoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODU1OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODU2OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwoKTsKQEAgLTI2OTQ2LDIyICsyNjk5MiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg1NjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgOiAoICdpbnN0YW5jZW9mJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg2MjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgOiAoICdpbnN0YW5jZW9mJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4NjA6MTogKCAoICdpbnN0YW5jZW9mJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODYxOjE6ICggJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODY2OjE6ICggKCAnaW5zdGFuY2VvZicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg2NzoxOiAoICdpbnN0YW5jZW9mJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg2MToxOiAoICdpbnN0YW5jZW9mJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg2MjoyOiAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODY3OjE6ICggJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODY4OjI6ICdpbnN0YW5jZW9mJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbnN0YW5jZW9mS2V5d29yZF8xXzBfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0yNjk4NywxNCArMjcwMzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg3MjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg3ODoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg3NjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODc3OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg4MjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODgzOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMF9fSW1wbCgpOwpAQCAtMjcwMjUsMjMgKzI3MDcxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4ODQ6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODkwOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg4ODoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg4OToxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODk0OjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODk1OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4ODk6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg5MDoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4OTU6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg5NjoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzg5MToyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4OTE6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4OTc6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3ODk3OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCgpOwpAQCAtMjcwNzYsMTQgKzI3MTIyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc4OTk6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzEgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MDU6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzEgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MDM6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkwNDoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MDk6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkxMDoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMV9fSW1wbCgpOwpAQCAtMjcxMDksMjMgKzI3MTU1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MTA6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MTY6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MTQ6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkxNToxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MjA6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkyMToxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MTU6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTE2OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTIxOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkyMjoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MTc6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MTc6MzogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkyMzoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkyMzozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCk7CkBAIC0yNzE2MCwxNCArMjcyMDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTI2OjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkzMjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkzMDoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MzE6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5MzY6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTM3OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbCgpOwpAQCAtMjcxOTMsMjMgKzI3MjM5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzkzNzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTQzOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk0MToxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTQyOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk0NzoxOiAoICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTQ4OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk0MjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5NDM6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5NDg6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTQ5OjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk0NDoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk0NDozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTUwOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTUwOjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAoKTsKQEAgLTI3MjQ0LDE0ICsyNzI5MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk1MzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk1OToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5NTc6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTU4OjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTYzOjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk2NDoyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181Nik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTI3MjgyLDIzICsyNzMyOCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk2NToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTcxOjE6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTY5OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTcwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5NzU6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5NzY6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk3MDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTcxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk3NjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTc3OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5NzI6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTcyOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5Nzg6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTc4OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0yNzMyMywxNCArMjczNjksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5ODA6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xIDogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk4NjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzEgOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk4NDoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk4NToyOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTkwOjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTkxOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTI3MzU2LDIzICsyNzQwMiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk5MToxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk5NzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5OTU6MTogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3OTk2OjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDAxOjE6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODAwMjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk5NjoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk5NzoyOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDAyOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDAzOjI6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc5OTg6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6Nzk5ODozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMDQ6MjogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODAwNDozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpOwpAQCAtMjc0MDcsMTQgKzI3NDUzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDA3OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDEzOjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODAxMToxOiAoIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMTI6MjogcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMTc6MTogKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDE4OjI6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQyKTsKICAgICAgICAgICAgIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMjc0NDUsMTcgKzI3NDkxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDE5OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggJzwnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDI1OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggJzwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODAyMzoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMjQ6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMjk6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDMwOjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDI0OjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDI1OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMzA6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwMzE6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8wKCkpOyAKQEAgLTI3NDg2LDE0ICsyNzUzMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODAzNDoxOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzEgOiBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDQwOjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMSA6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDM4OjE6ICggcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDM5OjI6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNDQ6MTogKCBydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNDU6MjogcnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMjc1MTksMTcgKzI3NTY1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDQ1OjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggJz0nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDUxOjE6IHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggJz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA0OToxOiAoICggJz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNTA6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNTU6MTogKCAoICc9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDU2OjE6ICggJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDUwOjE6ICggJz0nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDUxOjI6ICc9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNTY6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNTc6MjogJz0nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzFfMSgpKTsgCkBAIC0yNzU2MCwxNCArMjc2MDYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDYxOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDY3OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNjU6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNjY6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA3MToxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA3MjoyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYwKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTI3NTk4LDE3ICsyNzY0NCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNzM6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNzk6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA3NzoxOiAoICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA3ODoxOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDgzOjE6ICggKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDg0OjE6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwNzg6MTogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA3OToyOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwODQ6MTogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA4NToyOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0yNzY0MywxNCArMjc2ODksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDg4OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA5NDoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA5MjoxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwOTM6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgwOTg6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MDk5OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjc2NzYsMjkgKzI3NzIyLDI5IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODA5OToxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEwNToxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTAzOjE6ICggKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTA0OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMDk6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMTA6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEwNDoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTA1OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODExMDoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTExOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMDY6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTEyOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICBsb29wNzY6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDc2PTI7CiAgICAgICAgICAgICAgICAgYWx0NzYgPSBkZmE3Ni5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc2KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMDY6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTEyOjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzYxKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CkBAIC0yNzczOSwxNCArMjc3ODUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMTU6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMjE6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTE5OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEyMDoyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEyNToxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMjY6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCk7CkBAIC0yNzc3NywyMyArMjc4MjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMjc6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMzM6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTMxOjE6ICggKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEzMjoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEzNzoxOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMzg6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMzI6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMzM6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEzODoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEzOToyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTM0OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxMzQ6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTQwOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNDA6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTI3ODI4LDE0ICsyNzg3NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE0MjoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTQ4OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTQ2OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTQ3OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNTI6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNTM6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMjc4NjEsMjMgKzI3OTA3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTUzOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNTk6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNTc6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNTg6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE2MzoxOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE2NDoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTU4OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNTk6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTY0OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNjU6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNjA6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTYwOjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTY2OjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE2NjozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKTsKQEAgLTI3OTEyLDE0ICsyNzk1OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTY5OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTc1OjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTczOjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxNzQ6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTc5OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxODA6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTI3OTQ1LDIzICsyNzk5MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTgwOjE6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE4NjoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxODQ6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxODU6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE5MDoxOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE5MToxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTg1OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxODY6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTkxOjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxOTI6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxODc6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTg3OjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTkzOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODE5MzozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKTsKQEAgLTI3OTk2LDE0ICsyODA0MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgxOTY6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMDI6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIwMDoxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIwMToyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjA2OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjA3OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjApOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpOwpAQCAtMjgwMzQsMjMgKzI4MDgwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIwODoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIxNDoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjEyOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjEzOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMTg6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMTk6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIxMzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjE0OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIxOToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjIwOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjE1OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIxNTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjIxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIyMTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMjgwNzUsMTQgKzI4MTIxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIyMzoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMjk6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMjc6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjI4OjI6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjMzOjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIzNDoyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTI4MTA4LDIzICsyODE1NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMzQ6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI0MDoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMzg6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODIzOToxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNDQ6MTogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI0NToxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyMzk6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjQwOjI6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjQ1OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI0NjoyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNDE6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNDE6MzogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI0NzoyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI0NzozOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCk7CkBAIC0yODE1OSwxNCArMjgyMDUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF8yX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjUwOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjU2OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNTQ6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNTU6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI2MDoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI2MToyOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzYyKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwoKTsKQEAgLTI4MTk3LDE3ICsyODI0MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNjI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMF9fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjY4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzBfX0ltcGwgOiAoICc+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjY2OjE6ICggKCAnPicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI2NzoxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI3MjoxOiAoICggJz4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNzM6MTogKCAnPicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNjc6MTogKCAnPicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNjg6MjogJz4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI3MzoxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI3NDoyOiAnPicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKQEAgLTI4MjM4LDE0ICsyODI4NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyNzc6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMSA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjgzOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjgxOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI4MjoyOiBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI4NzoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyODg6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsKCk7CkBAIC0yODI3MSwxNyArMjgzMTcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mjg4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzFfX0ltcGwgOiAoICcuLicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyOTQ6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMV9fSW1wbCA6ICggJy4uJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjkyOjE6ICggKCAnLi4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyOTM6MTogKCAnLi4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mjk4OjE6ICggKCAnLi4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgyOTk6MTogKCAnLi4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MjkzOjE6ICggJy4uJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI5NDoyOiAnLi4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODI5OToxOiAoICcuLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMDA6MjogJy4uJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMl8xKCkpOyAKQEAgLTI4MzEyLDE0ICsyODM1OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMDQ6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMTA6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMwODoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMwOToyOiBydWxlX19PcE90aGVyX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzE0OjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzE1OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjMpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCgpOwpAQCAtMjgzNTAsMTcgKzI4Mzk2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMxNjoxOiBydWxlX19PcE90aGVyX19Hcm91cF81X18wX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMjI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMF9fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMjA6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzIxOjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzI2OjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMyNzoxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMyMToxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMyMjoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzI3OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzI4OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzAoKSk7IApAQCAtMjgzOTEsMTQgKzI4NDM3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODMzMToxOiBydWxlX19PcE90aGVyX19Hcm91cF81X18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMzc6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMSA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzMzU6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzM2OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzQxOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM0MjoyOiBydWxlX19PcE90aGVyX19Hcm91cF81X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwoKTsKQEAgLTI4NDI0LDIzICsyODQ3MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNDI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNDg6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCA6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM0NjoxOiAoICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM0NzoxOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzUyOjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzUzOjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNDc6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM0ODoyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNTM6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM1NDoyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzVfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM0OToyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNDk6MzogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNTU6MjogKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzU1OjM6IHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMSgpOwpAQCAtMjg0NzUsMTQgKzI4NTIxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNTg6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNjQ6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNjI6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM2MzoyOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNjg6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM2OToyOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCgpOwpAQCAtMjg1MDgsMjMgKzI4NTU0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNjk6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mzc1OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM3MzoxOiAoICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM3NDoxOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mzc5OjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzgwOjE6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNzQ6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM3NToyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzODA6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM4MToyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM3NjoyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzNzY6MzogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzODI6MjogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzgyOjM6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCgpOwpAQCAtMjg1NTksMTQgKzI4NjA1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM4NToxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODM5MToxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mzg5OjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MzkwOjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzOTU6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjgzOTY6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182Myk7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsKCk7CkBAIC0yODU5NywxNyArMjg2NDMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Mzk3OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzBfX0ltcGwgOiAoICc+JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQwMzoxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wX19JbXBsIDogKCAnPicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQwMToxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0MDI6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0MDc6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDA4OjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDAyOjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDAzOjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0MDg6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0MDk6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8wXzBfMCgpKTsgCkBAIC0yODYzOCwxNCArMjg2ODQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDEyOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQxODoxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQxNjoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0MTc6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0MjI6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDIzOjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtMjg2NzEsMTcgKzI4NzE3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQyMzoxOiBydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18xX19JbXBsIDogKCAnPicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0Mjk6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMV9fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0Mjc6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDI4OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDMzOjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQzNDoxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQyODoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQyOToyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDM0OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDM1OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzEoKSk7IApAQCAtMjg3MTIsMTQgKzI4NzU4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQzOToxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ0NToxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18wIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDQzOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDQ0OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NDk6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NTA6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182NCk7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsKCk7CkBAIC0yODc1MCwxNyArMjg3OTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDUxOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzBfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ1NzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18wX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ1NToxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NTY6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NjE6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDYyOjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDU2OjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDU3OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NjI6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NjM6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMCgpKTsgCkBAIC0yODc5MSwxNCArMjg4MzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82X18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDY2OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ3MjoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xIDogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ3MDoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NzE6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0NzY6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDc3OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbCgpOwpAQCAtMjg4MjQsMjMgKzI4ODcwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ3NzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ4MzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDgxOjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDgyOjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0ODc6MTogKCAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0ODg6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ4MjoxOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDgzOjI6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ4ODoxOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDg5OjI6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfNl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDg0OjI6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ4NDozOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ5MDoyOiAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg0OTA6MzogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xKCk7CkBAIC0yODg3NSwxNCArMjg5MjEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ5MzoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ5OToxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODQ5NzoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NDk4OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUwMzoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTA0OjI6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsKCk7CkBAIC0yODkwOCwyMyArMjg5NTQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUwNDoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MTA6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTA4OjE6ICggKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTA5OjE6ICggKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MTQ6MTogKCAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MTU6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUwOToxOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTEwOjI6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUxNToxOiAoICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTE2OjI6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTExOjI6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUxMTozOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUxNzoyOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MTc6MzogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wKCk7CkBAIC0yODk1OSwxNCArMjkwMDUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTIwOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTI2OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAgOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MjQ6MTogKCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MjU6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMF9fSW1wbCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUzMDoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUzMToyOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ4KTsKICAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTI4OTk3LDE3ICsyOTA0MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1MzI6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMF9fSW1wbCA6ICggJzwnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTM4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzBfX0ltcGwgOiAoICc8JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTM2OjE6ICggKCAnPCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODUzNzoxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU0MjoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1NDM6MTogKCAnPCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1Mzc6MTogKCAnPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1Mzg6MjogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU0MzoxOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU0NDoyOiAnPCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzBfMF8wKCkpOyAKQEAgLTI5MDM4LDE0ICsyOTA4NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1NDc6MTogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMSA6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTUzOjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzEgOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTUxOjE6ICggcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU1MjoyOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU1NzoxOiAoIHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1NTg6MjogcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsKCk7CkBAIC0yOTA3MSwxNyArMjkxMTcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTU4OjE6IHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzFfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU2NDoxOiBydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18xX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU2MjoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1NjM6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1Njg6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTY5OjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTYzOjE6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTY0OjI6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1Njk6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1NzA6MjogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMSgpKTsgCkBAIC0yOTExMiwxNCArMjkxNTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU3NDoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU4MDoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU3ODoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTc5OjI6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU4NDoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTg1OjI6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV182NSk7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMjkxNTAsMTcgKzI5MTk2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1ODY6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTkyOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU5MDoxOiAoICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU5MToxOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTk2OjE6ICggKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NTk3OjE6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1OTE6MTogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU5MjoyOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg1OTc6MTogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODU5ODoyOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMjkxOTUsMTQgKzI5MjQxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MDE6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MDc6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MDU6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYwNjoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTE6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYxMjoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjkyMjgsMjIgKzI5Mjc0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTI6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYxODoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjE2OjE6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYxNzoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYyMjoxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MjM6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTc6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTg6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYyMzoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYyNDoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTk6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYyNToyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A3NzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0Nzc9MjsKQEAgLTI5MjUyLDcgKzI5Mjk4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoIChMQTc3XzA9PTM1KSApIHsKICAgICAgICAgICAgICAgICAgICAgaW50IExBNzdfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nzc9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yOTI2MSw3ICsyOTMwNyw3IEBACiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTc3XzA9PTM0KSApIHsKICAgICAgICAgICAgICAgICAgICAgaW50IExBNzdfMyA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nzc9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yOTI3MSw3ICsyOTMxNyw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc3KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTk6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYyNTozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjYpOwogICAgICAgICAgICAgCSAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CkBAIC0yOTMxMiwxNCArMjkzNTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjI4OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjM0OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MzI6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MzM6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYzODoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODYzOToyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKTsKQEAgLTI5MzUwLDIzICsyOTM5NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NDA6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY0NjoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NDQ6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY0NToxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NTA6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY1MToxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NDU6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjQ2OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjUxOjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY1MjoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NDc6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NDc6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY1MzoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY1MzozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKCk7CkBAIC0yOTQwMSwxNCArMjk0NDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjU1OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY2MToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY1OToxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NjA6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NjU6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjY2OjI6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMjk0MzQsMjMgKzI5NDgwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY2NjoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NzI6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NzA6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjcxOjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Njc2OjE6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY3NzoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY3MToxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY3MjoyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Njc3OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Njc4OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2NzM6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY3MzozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2Nzk6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY3OTozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpOwpAQCAtMjk0ODUsMTQgKzI5NTMxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NjgyOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2ODg6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2ODY6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2ODc6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY5MjoxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY5MzoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCk7CkBAIC0yOTUxOCwyMyArMjk1NjQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2OTM6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2OTk6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Njk3OjE6ICggKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODY5ODoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODcwMzoxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MDQ6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2OTg6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2OTk6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODcwNDoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODcwNToyOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzAwOjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MDA6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzA2OjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MDY6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKTsKQEAgLTI5NTY5LDE0ICsyOTYxNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzA5OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzE1OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzEzOjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MTQ6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzE5OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MjA6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY1KTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CkBAIC0yOTYwNywyMyArMjk2NTMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODcyMToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3Mjc6MTogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzI1OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzI2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MzE6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MzI6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODcyNjoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzI3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODczMjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzMzOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODcyODoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3Mjg6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODczNDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3MzQ6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTI5NjQ4LDE0ICsyOTY5NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzM2OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzQyOjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzQwOjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NDE6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzQ2OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NDc6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTI5NjgxLDIzICsyOTcyNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzQ3OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc1MzoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NTE6MTogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NTI6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc1NzoxOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc1ODoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzUyOjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NTM6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzU4OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NTk6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NTQ6MjogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzU0OjM6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzYwOjI6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc2MDozOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKTsKQEAgLTI5NzMyLDE0ICsyOTc3OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzYzOjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzY5OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzY3OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3Njg6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzczOjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3NzQ6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY3KTsKICAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CkBAIC0yOTc3MCwxNyArMjk4MTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc3NToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc4MToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc3OToxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4NzgwOjE6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc4NToxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Nzg2OjE6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc4MDoxOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3ODE6MjogcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3ODY6MTogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4Nzg3OjI6IHJ1bGVYVW5hcnlPcGVyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMjk4MTUsMTQgKzI5ODYxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3OTA6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3OTY6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg3OTQ6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODc5NToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MDA6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgwMToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMjk4NDgsMjIgKzI5ODk0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MDE6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgwNzoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODA1OjE6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgwNjoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgxMToxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MTI6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MDY6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MDc6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgxMjoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgxMzoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MDg6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgxNDoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A3ODoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0Nzg9MjsKQEAgLTI5ODcyLDcgKzI5OTE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE3OF8yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3OD0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTI5ODgzLDcgKzI5OTI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE3OF8zID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3OD0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTI5ODk0LDcgKzI5OTQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE3OF80ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3OD0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTI5OTA1LDcgKzI5OTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE3OF81ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3OD0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTI5OTE3LDcgKzI5OTYzLDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzgpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgwODozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODE0OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV182OCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKTsKQEAgLTI5OTU4LDE0ICszMDAwNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MTc6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MjM6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgyMToxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgyMjoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODI3OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODI4OjI6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMjk5OTYsMjMgKzMwMDQyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgyOToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODM1OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgzMzoxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODM0OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgzOToxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODQwOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgzNDoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MzU6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NDA6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODQxOjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgzNjoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODgzNjozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODQyOjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODQyOjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTMwMDQ3LDE0ICszMDA5MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NDQ6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODUwOjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODQ4OjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg0OToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg1NDoxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NTU6MjogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0zMDA4MCwyMyArMzAxMjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODU1OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg2MToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg1OToxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NjA6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NjU6MTogKCAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODY2OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODYwOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODYxOjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NjY6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4Njc6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg2MjoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODYyOjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg2ODoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODY4OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCk7CkBAIC0zMDEzMSwxNCArMzAxNzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4NzE6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg3NzoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg3NToxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg3NjoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODgxOjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODgyOjI6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTMwMTY0LDIzICszMDIxMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg4MjoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg4ODoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4ODY6MTogKCAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODg3OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODkyOjE6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg5MzoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg4NzoxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg4ODoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODkzOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODk0OjI6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4ODk6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg4OTozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4OTU6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODg5NTozOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCgpOwpAQCAtMzAyMTUsMTQgKzMwMjYxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4OTg6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MDQ6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MDI6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkwMzoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MDg6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkwOToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNjcpOwogICAgICAgICAgICAgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTMwMjUzLDIzICszMDI5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTEwOjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkxNjoxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MTQ6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MTU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkyMDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkyMToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTE1OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MTY6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTIxOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MjI6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTE3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkxNzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTIzOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkyMzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzAyOTQsMTQgKzMwMzQwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MjU6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MzE6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Mjk6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkzMDoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MzU6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODkzNjoyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpOwpAQCAtMzAzMjcsMjMgKzMwMzczLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5MzY6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTQyOjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk0MDoxOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk0MToxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTQ2OjE6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTQ3OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NDE6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk0MjoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NDc6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk0ODoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk0MzoyOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NDM6MzogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NDk6MjogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTQ5OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpOwpAQCAtMzAzNzgsMTQgKzMwNDI0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTUyOjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTU4OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk1NjoxOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NTc6MjogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NjI6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTYzOjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzY5KTsKICAgICAgICAgICAgIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCgpOwpAQCAtMzA0MTYsMjMgKzMwNDYyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTY0OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NzA6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Njg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Njk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk3NDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk3NToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTY5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NzA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTc1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NzY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFVuYXJ5T3BlcmF0aW9uQWN0aW9uXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk3MToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5NzE6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk3NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5Nzc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTMwNDU3LDE0ICszMDUwMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk3OToxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEgOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk4NToxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEgOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5ODM6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTg0OjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTg5OjE6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk5MDoyOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwoKTsKQEAgLTMwNDk1LDIzICszMDU0MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk5MToxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk5NzoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5OTU6MTogKCAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4OTk2OjE6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDAxOjE6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAwMjoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk5NjoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk5NzoyOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDAyOjE6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDAzOjI6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg5OTg6MjogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODk5ODozOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMDQ6MjogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAwNDozOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSgpOwpAQCAtMzA1NDYsMTQgKzMwNTkyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDA2OjE6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMTI6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yIDogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMTA6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMTE6MjogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAxNjoxOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAxNzoyOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsKCk7CkBAIC0zMDU3OSwyMyArMzA2MjUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMTc6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMjM6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsIDogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDIxOjE6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAyMjoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAyNzoxOiAoICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMjg6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMjI6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMjM6MjogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAyODoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAyOToyOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZEFzc2lnbm1lbnRfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDI0OjI6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMjQ6MzogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDMwOjI6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMzA6MzogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIoKTsKQEAgLTMwNjMwLDE0ICszMDY3NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAzMzoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTAzOToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwMzc6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDM4OjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDQzOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA0NDoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183MCk7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTMwNjY4LDE3ICszMDcxNCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA0NToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA1MToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwNDk6MTogKCAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDUwOjE6ICggcnVsZVhQb3N0Zml4T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDU1OjE6ICggKCBydWxlWFBvc3RmaXhPcGVyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA1NjoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA1MDoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA1MToyOiBydWxlWFBvc3RmaXhPcGVyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDU2OjE6ICggcnVsZVhQb3N0Zml4T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDU3OjI6IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0zMDcxMywxNCArMzA3NTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwNjA6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA2NjoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA2NDoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA2NToyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDcwOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDcxOjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTMwNzQ2LDMxICszMDc5MiwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA3MToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwNzc6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA3NToxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDc2OjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA4MToxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDgyOjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA3NjoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwNzc6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwODI6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDgzOjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDc4OjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDg0OjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A3OToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0Nzk9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE3OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTc5XzA9PTg1KSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTc5XzA9PTg2KSApIHsKICAgICAgICAgICAgICAgICAgICAgaW50IExBNzlfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjdfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyOF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nzk9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zMDc4MCw3ICszMDgyNiw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc5KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwNzg6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwODQ6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183MSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CkBAIC0zMDgyMSwxNCArMzA4NjcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA4NzoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA5MzoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA5MToxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDkyOjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA5NzoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDk4OjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OCk7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMzA4NTksMjMgKzMwOTA1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwOTk6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTA1OjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEwMzoxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEwNDoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTA5OjE6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTEwOjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMDQ6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEwNToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMTA6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTExMToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEwNjoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMDY6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMTI6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTEyOjM6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCgpOwpAQCAtMzA5MTAsMTQgKzMwOTU2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMTQ6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMjA6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMTg6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTExOToyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMjQ6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEyNToyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtMzA5NDMsMjMgKzMwOTg5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMjU6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTMxOjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEyOToxOiAoICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEzMDoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTM1OjE6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTM2OjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMzA6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEzMToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMzY6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEzNzoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTEzMjoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMzI6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxMzg6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTM4OjM6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSgpOwpAQCAtMzA5OTQsMTQgKzMxMDQwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE0MToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNDc6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNDU6MTogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTQ2OjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTUxOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE1MjoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTMxMDI3LDIzICszMTA3MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNTI6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE1ODoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNTY6MTogKCAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE1NzoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNjI6MTogKCAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE2MzoxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNTc6MTogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTU4OjI6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTYzOjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE2NDoyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNTk6MjogKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNTk6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE2NToyOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE2NTozOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCk7CkBAIC0zMTA3OCwxNCArMzExMjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNjg6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNzQ6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTcyOjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE3MzoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE3ODoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxNzk6MjogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzApOwogICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CkBAIC0zMTExNiwyMyArMzExNjIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxODA6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE4NjoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE4NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE4NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTkwOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTkxOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxODU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE4NjoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxOTE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE5MjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxODc6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTg3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxOTM6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MTkzOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zMTE1NywxNCArMzEyMDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkxOTU6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xIDogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIwMToxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEgOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTE5OToxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIwMDoyOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjA1OjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjA2OjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTMxMTkwLDIyICszMTIzNiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIwNjoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICdhcycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMTI6MTogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAnYXMnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIxMDoxOiAoICggJ2FzJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjExOjE6ICggJ2FzJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIxNjoxOiAoICggJ2FzJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjE3OjE6ICggJ2FzJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIxMToxOiAoICdhcycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMTI6MjogJ2FzJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMTc6MTogKCAnYXMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjE4OjI6ICdhcycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBc0tleXdvcmRfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBc0tleXdvcmRfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zMTIzMSwxNCArMzEyNzcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMjI6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMjg6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjI2OjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIyNzoyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIzMjoxOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMzM6MjogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsKCk7CkBAIC0zMTI2OSwxNyArMzEzMTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMzQ6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX19JbXBsIDogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjQwOjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMzg6MTogKCAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTIzOToxOiAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNDQ6MTogKCAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI0NToxOiAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyMzk6MTogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjQwOjI6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjQ1OjE6ICggcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI0NjoyOiBydWxlWE1lbWJlckZlYXR1cmVDYWxsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC0zMTMxNCwxNCArMzEzNjAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNDk6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI1NToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI1MzoxOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI1NDoyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjU5OjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjYwOjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTMxMzQ3LDQyICszMTM5Myw0MiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI2MDoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNjY6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI2NDoxOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjY1OjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI3MDoxOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjcxOjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI2NToxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNjY6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNzE6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjcyOjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjY3OjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjczOjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ4MD0yOwogICAgICAgICAgICAgaW50IExBODBfMCA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICBpZiAoIChMQTgwXzA9PTQxKSApIHsKICAgICAgICAgICAgICAgICBpbnQgTEE4MF8xID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyOV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQ4MD0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4MF8wPT00MikgKSB7CiAgICAgICAgICAgICAgICAgaW50IExBODBfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyOF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjlfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0ODA9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNjc6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNzM6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAoKTsKQEAgLTMxNDIwLDE0ICszMTQ2NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mjc2OjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjgyOjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjgwOjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyODE6MjogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mjg2OjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyODc6MjogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwoKTsKQEAgLTMxNDUzLDIzICszMTQ5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mjg3OjE6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI5MzoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOTE6MTogKCAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOTI6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI5NzoxOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI5ODoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjkyOjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOTM6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mjk4OjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOTk6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyOTQ6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mjk0OjM6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzAwOjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMwMDozOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAoKTsKQEAgLTMxNTA0LDE0ICszMTU1MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzMDM6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzMDk6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMwNzoxOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMwODoyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzEzOjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzE0OjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCgpOwpAQCAtMzE1NDIsMjMgKzMxNTg4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMxNToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMyMToxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzE5OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzIwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzMjU6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzMjY6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMyMDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzIxOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMyNjoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzI3OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzIyOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMyMjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzI4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMyODozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzE1ODMsMTQgKzMxNjI5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTMzMDoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xIDogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzMzY6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzMzQ6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzM1OjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzQwOjE6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM0MToyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwoKTsKQEAgLTMxNjE2LDIzICszMTY2MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNDE6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM0NzoxOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNDU6MTogKCAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM0NjoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNTE6MTogKCAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM1MjoxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNDY6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzQ3OjI6ICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzUyOjE6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM1MzoyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNDg6MjogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNDg6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM1NDoyOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM1NDozOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xKCk7CkBAIC0zMTY2NywxNCArMzE3MTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzU3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzYzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNjE6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNjI6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM2NzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM2ODoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTMxNzA1LDE3ICszMTc1MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNjk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM3NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIDogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNzM6MTogKCAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM3NDoxOiAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNzk6MTogKCAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM4MDoxOiAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzNzQ6MTogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzc1OjI6IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MzgwOjE6ICggcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM4MToyOiBydWxlWFByaW1hcnlFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhQcmltYXJ5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtMzE3NTAsMTQgKzMxNzk2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM4NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzOTA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzODg6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzg5OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzk0OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTM5NToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTMxNzgzLDIyICszMTgyOSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkzOTU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDAxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Mzk5OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQwMDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQwNToxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MDY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MDA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MDE6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQwNjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQwNzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MDI6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQwODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEgKSoKICAgICAgICAgICAgIGxvb3A4MToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0ODE9MjsKQEAgLTMxODA3LDE4ICszMTg1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaW50IExBODFfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjlfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsdDgxPTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDY6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IExBODFfMyA9IGlucHV0LkxBKDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjlfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzMF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWx0ODE9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zMTgyNyw5ICszMTg2MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDEwNzoKICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE4MV8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzMF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0ODE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDEwODoKKyAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEE4MV80ID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyOV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTMwX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4MT0xOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTMxODQxLDcgKzMxODg3LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODEpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQwMjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDA4OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV183NCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEoKTsKQEAgLTMxODgyLDE0ICszMTkyOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDExOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDE3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDE1OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MTY6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDIxOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MjI6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsKCk7CkBAIC0zMTkyMCwyMyArMzE5NjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQyMzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0Mjk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDI3OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDI4OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MzM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MzQ6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQyODoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDI5OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQzNDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDM1OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDMwOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQzMDozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQzNjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MzY6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wKCk7CkBAIC0zMTk3MSwxNCArMzIwMTcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQzODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ0NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ0MjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDQzOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ0ODoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDQ5OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsKCk7CkBAIC0zMjAwNCwyMyArMzIwNTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ0OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDU1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0NTM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDU0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDU5OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ2MDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ1NDoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ1NToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDYwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDYxOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMV8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0NTY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ1NjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0NjI6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ2MjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSgpOwpAQCAtMzIwNTUsMTQgKzMyMTAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ2NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0NzE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0Njk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDcwOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDc1OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ3NjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKTsKQEAgLTMyMDg4LDIzICszMjEzNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0NzY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ4MjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0ODA6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ4MToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0ODY6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ4NzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0ODE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDgyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDg3OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ4ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0ODM6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0ODM6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ4OToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ4OTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wKCk7CkBAIC0zMjEzOSwxNCArMzIxODUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0OTI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0OTg6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDk2OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTQ5NzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUwMjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1MDM6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzUpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsKCk7CkBAIC0zMjE3NywyMyArMzIyMjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1MDQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUxMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUwODoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUwOToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTE0OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTE1OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1MDk6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUxMDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1MTU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUxNjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTExOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUxMTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTE3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUxNzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzIyMTgsMTQgKzMyMjY0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTE5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTI1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUyMzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1MjQ6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1Mjk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTMwOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQ2KTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCgpOwpAQCAtMzIyNTYsMjMgKzMyMzAyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTMxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUzNzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTM1OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1MzY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTQxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NDI6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTM2OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTUzNzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU0MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NDM6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTM4OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTM4OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NDQ6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NDQ6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSgpOwpAQCAtMzIzMDcsMTQgKzMyMzUzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTQ2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTUyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU1MDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NTE6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NTY6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzJfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTU3OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQyKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCgpOwpAQCAtMzIzNDUsMjMgKzMyMzkxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTU4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTY0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU2MjoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NjM6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1Njg6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTY5OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTYzOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTY0OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1Njk6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NzA6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU2NToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTY1OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU3MToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTcxOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yKCk7CkBAIC0zMjM5NiwxNCArMzI0NDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1NzM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU3OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzMgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU3NzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU3ODoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTgzOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTg0OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwoKTsKQEAgLTMyNDI5LDE3ICszMjQ3NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfMF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU4NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwgOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU5MDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwgOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk1ODg6MTogKCAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTg5OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTk0OjE6ICggKCBydWxlT3BTaW5nbGVBc3NpZ24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU5NToxOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU4OToxOiAoIHJ1bGVPcFNpbmdsZUFzc2lnbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTU5MDoyOiBydWxlT3BTaW5nbGVBc3NpZ24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTk1OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NTk2OjI6IHJ1bGVPcFNpbmdsZUFzc2lnbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRPcFNpbmdsZUFzc2lnblBhcnNlclJ1bGVDYWxsXzFfMF8wXzBfMygpKTsgCkBAIC0zMjQ3NCwxNCArMzI1MjAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYwMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYwNjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYwNDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjA1OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYxMDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjExOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMF9fSW1wbCgpOwpAQCAtMzI1MTIsMjMgKzMyNTU4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MTI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjE4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYxNjoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYxNzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjIyOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjIzOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MTc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYxODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MjM6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYyNDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYxOToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MTk6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MjU6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjI1OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCgpOwpAQCAtMzI1NjMsMTQgKzMyNjA5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2Mjc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MzM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2MzE6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYzMjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2Mzc6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTYzODoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzFfX0ltcGwoKTsKQEAgLTMyNjAxLDIyICszMjY0NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjM5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NDU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY0MzoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NDQ6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NDk6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjUwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjQ0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjQ1OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NTA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NTE6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjQ2OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NTI6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0ODI9MjsKICAgICAgICAgICAgIGludCBMQTgyXzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMzI2MjUsNyArMzI2NzEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ4MikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjQ2OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NTI6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wKCk7CkBAIC0zMjY2MywxNCArMzI3MDksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY1NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY2MDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY1ODoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjU5OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY2NDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjY1OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nyk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMl9fSW1wbCgpOwpAQCAtMzI3MDEsMjMgKzMyNzQ3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NjY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzJfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjcyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18yX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY3MDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY3MToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Njc2OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Njc3OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NzE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY3MjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2Nzc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY3ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY3MzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2NzM6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2Nzk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Njc5OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMigpOwpAQCAtMzI3NTIsMTQgKzMyNzk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2ODE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzMgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2ODc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzMgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2ODU6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY4NjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2OTE6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY5MjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzcpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwoKTsKQEAgLTMyNzkwLDI3ICszMjgzNiwyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NjkzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX18zX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2OTk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzNfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTY5NzoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk2OTg6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDM6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzA0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Njk4OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Njk5OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDQ6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDU6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzAwOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0ODM9MjsKICAgICAgICAgICAgIGFsdDgzID0gZGZhODMucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgzKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDA6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTcwNjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAoKTsKQEAgLTMyODQ4LDE0ICszMjg5NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzA4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180IDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzE0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180IDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzEyOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MTM6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzE4OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MTk6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwoKTsKQEAgLTMyODgxLDI3ICszMjkyNywyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzE5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xX180X19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MjU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzRfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTcyMzoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MjQ6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3Mjk6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzMwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzI0OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzI1OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MzA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MzE6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzI2OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MzI6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/CiAgICAgICAgICAgICBpbnQgYWx0ODQ9MjsKICAgICAgICAgICAgIGFsdDg0ID0gZGZhODQucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDg0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MjY6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTczMjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQoKTsKQEAgLTMyOTM5LDE0ICszMjk4NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MzU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzQxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzM5OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc0MDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc0NToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NDY6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsKCk7CkBAIC0zMjk3MiwyMyArMzMwMTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzQ2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NTI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzUwOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NTE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzU2OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NTc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzUxOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc1MjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc1NzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NTg6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzUzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzUzOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NTk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NTk6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCgpOwpAQCAtMzMwMjMsMTQgKzMzMDY5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzYyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzY4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc2NjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3Njc6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3NzI6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzczOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzczKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCgpOwpAQCAtMzMwNjEsMjMgKzMzMTA3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Nzc0OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3ODA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3Nzg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3Nzk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc4NDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc4NToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Nzc5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3ODA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Nzg1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3ODY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3ODE6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzgxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3ODc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Nzg3OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zMzEwMiwxNCArMzMxNDgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3ODk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc5NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc5MzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTc5NDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5Nzk5OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODAwOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTMzMTM1LDIzICszMzE4MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgwMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MDY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgwNDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODA1OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgxMDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODExOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgwNToxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MDY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MTE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODEyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgwNzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgwNzozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODEzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODEzOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfMF8wXzEoKTsKQEAgLTMzMTg2LDE0ICszMzIzMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MTY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MjI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgyMDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgyMToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODI2OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODI3OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCgpOwpAQCAtMzMyMjQsMTcgKzMzMjcwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgyODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wX19JbXBsIDogKCAnPCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MzQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMF9fSW1wbCA6ICggJzwnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4MzI6MTogKCAoICc8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODMzOjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODM4OjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgzOToxOiAoICc8JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgzMzoxOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTgzNDoyOiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODM5OjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODQwOjI6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMV8xXzAoKSk7IApAQCAtMzMyNjUsMTQgKzMzMzExLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg0MzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg0OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODQ3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODQ4OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4NTM6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4NTQ6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OSk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsKCk7CkBAIC0zMzMwMywyMyArMzMzNDksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODU1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4NjE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODU5OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4NjA6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODY1OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4NjY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODYwOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg2MToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg2NjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4Njc6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODYyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODYyOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4Njg6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4Njg6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpOwpAQCAtMzMzNTQsMTQgKzMzNDAwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg3MDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg3NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODc0OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODc1OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4ODA6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4ODE6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMl9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OSk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsKCk7CkBAIC0zMzM5MiwzNSArMzM0MzgsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODgyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODg4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4ODY6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4ODc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg5MjoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg5MzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODg3OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4ODg6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5ODkzOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4OTQ6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzFfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg4OToyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4OTU6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAgKSoKICAgICAgICAgICAgIGxvb3A4NToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0ODU9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE4NV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTg1XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTg1XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0ODU9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODUpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTg4OTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4OTU6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAoKTsKQEAgLTMzNDYxLDE0ICszMzUwNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk4OTc6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fMyA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTAzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzMgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTAxOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTkwMjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTkwNzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MDg6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsKCk7CkBAIC0zMzQ5NCwxNyArMzM1NDAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTA4OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzNfX0ltcGwgOiAoICc+JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTkxNDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18zX19JbXBsIDogKCAnPicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTkxMjoxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MTM6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MTg6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTE5OjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTEzOjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTE0OjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MTk6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MjA6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV8xXzFfMygpKTsgCkBAIC0zMzUzNSwxNCArMzM1ODEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MjQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MzA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTI4OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTkyOToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTkzNDoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MzU6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsKCk7CkBAIC0zMzU3MywyMiArMzM2MTksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5MzY6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NDI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTQwOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk0MToxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk0NjoxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NDc6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NDE6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NDI6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk0NzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk0ODoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zMzYxNCwxNCArMzM2NjAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NTE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk1NzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzEgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk1NToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk1NjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTYxOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTYyOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwoKTsKQEAgLTMzNjQ3LDIzICszMzY5MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk2MjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk2ODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NjY6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTY3OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTcyOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk3MzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk2NzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk2ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTczOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTc0OjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5Njk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk2OTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5NzU6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk3NTozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSgpOwpAQCAtMzM2OTgsMTQgKzMzNzQ0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk3ODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk4NDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTgyOjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTgzOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5ODg6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5ODk6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MCk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsKCk7CkBAIC0zMzczNiwyMyArMzM3ODIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5OTkwOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzBfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk5NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk5NDoxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5OTU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDAwOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMDE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5OTU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5OTY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMDE6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDAyOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk5OTc6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTk5NzozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDAzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDAzOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wKCk7CkBAIC0zMzc4NywxNCArMzM4MzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAwNToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMTE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMDk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDEwOjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDE1OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMV9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAxNjoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18xX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwoKTsKQEAgLTMzODI1LDMxICszMzg3MSwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDE3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMjM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMV9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDIxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMjI6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDI3OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMjg6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDIyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAyMzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAyODoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMjk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAyNDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAzMDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEgKT8KICAgICAgICAgICAgIGludCBhbHQ4Nj0yOwogICAgICAgICAgICAgaW50IExBODZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEE4Nl8wPj1SVUxFX0lEICYmIExBODZfMDw9UlVMRV9TVFJJTkcpfHxMQTg2XzA9PTI3fHxMQTg2XzA9PTMxfHwoTEE4Nl8wPj0zNCAmJiBMQTg2XzA8PTM1KXx8TEE4Nl8wPT00MHx8KExBODZfMD49NDUgJiYgTEE4Nl8wPD01MCl8fExBODZfMD09NjB8fExBODZfMD09Nzh8fChMQTg2XzA+PTgyICYmIExBODZfMDw9ODMpfHxMQTg2XzA9PTg2fHxMQTg2XzA9PTg4fHwoTEE4Nl8wPj05MSAmJiBMQTg2XzA8PTk5KXx8TEE4Nl8wPT0xMDF8fExBODZfMD09MTA4fHxMQTg2XzA9PTExMCkgKSB7CisgICAgICAgICAgICBpZiAoICgoTEE4Nl8wPj1SVUxFX0lEICYmIExBODZfMDw9UlVMRV9TVFJJTkcpfHxMQTg2XzA9PTI3fHxMQTg2XzA9PTMxfHwoTEE4Nl8wPj0zNCAmJiBMQTg2XzA8PTM1KXx8TEE4Nl8wPT00MHx8KExBODZfMD49NDUgJiYgTEE4Nl8wPD01MCl8fExBODZfMD09NjF8fExBODZfMD09Nzl8fChMQTg2XzA+PTgzICYmIExBODZfMDw9ODQpfHxMQTg2XzA9PTg3fHxMQTg2XzA9PTg5fHwoTEE4Nl8wPj05MiAmJiBMQTg2XzA8PTEwMCl8fExBODZfMD09MTAyfHxMQTg2XzA9PTEwOXx8TEE4Nl8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDg2PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDg2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDI0OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDMwOjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSgpOwpAQCAtMzM4ODcsMTQgKzMzOTMzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMzI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMiA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAzODoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwMzY6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDAzNzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNDI6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA0MzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwoKTsKQEAgLTMzOTIwLDIyICszMzk2NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDQzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNDk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMl9fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDQ3OjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNDg6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDUzOjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNTQ6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDQ4OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA0OToyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA1NDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNTU6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzFfMV8zXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzFfMV8zXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzM5NjEsMTQgKzM0MDA3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDU5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA2NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNjM6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNjQ6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA2OToxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA3MDoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzBfX0ltcGwoKTsKQEAgLTMzOTk5LDIzICszNDA0NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA3MToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDc3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwNzU6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDc2OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDgxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA4MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA3NjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA3NzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDgyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDgzOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA3ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDc4OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA4NDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDg0OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCgpOwpAQCAtMzQwNTAsMTQgKzM0MDk2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDg2OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA5MjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwOTA6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAwOTE6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA5NjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDA5NzoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV9fMV9fSW1wbCgpOwpAQCAtMzQwODMsMzUgKzM0MTI5LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMDk3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTAzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTAxOjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMDI6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTA3OjE6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMDg6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTAyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEwMzoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEwODoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMDk6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEwNDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDExMDoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A4NzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0ODc9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE4N18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTg3XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTg3XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0ODc9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODcpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMDQ6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMTA6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCgpOwpAQCAtMzQxNTIsMTQgKzM0MTk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMTM6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMCA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTE5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAgOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTE3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDExODoyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEyMzoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMjQ6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsKCk7CkBAIC0zNDE5MCwyMiArMzQyMzYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEyNToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTMxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEyOToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTMwOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEzNToxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTM2OjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDEzMDoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMzE6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxMzY6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTM3OjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzNfMV8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8zXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzQyMzEsMTQgKzM0Mjc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNDA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSA6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE0NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xIDogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNDQ6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE0NToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNTA6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE1MToyOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwoKTsKQEAgLTM0MjY0LDIzICszNDMxMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTUxOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTU3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNTU6MTogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNTY6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE2MToxOiAoICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE2MjoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTU2OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNTc6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTYyOjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNjM6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE1ODoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNTg6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNjQ6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTY0OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEoKTsKQEAgLTM0MzE1LDE0ICszNDM2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNjc6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTczOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNzE6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE3MjoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNzc6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE3ODoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NCk7CiAgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTM0MzUzLDIzICszNDM5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxNzk6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxODU6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTgzOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE4NDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE4OToxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxOTA6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxODQ6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxODU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE5MDoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE5MToyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldFhTZXRMaXRlcmFsQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTg2OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxODY6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAxOTI6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE5MjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzQzOTQsMTQgKzM0NDQwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE5NDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMDA6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDE5ODoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMTk5OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIwNDoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjA1OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zNDQzMiwyMiArMzQ0NzgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjA2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggJyMnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIxMjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICcjJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjEwOjE6ICggKCAnIycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMTE6MTogKCAnIycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjE2OjE6ICggKCAnIycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMTc6MTogKCAnIycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjExOjE6ICggJyMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIxMjoyOiAnIycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIxNzoxOiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMTg6MjogJyMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM0NDczLDE0ICszNDUxOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMjE6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjI3OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMiA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMjU6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIyNjoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMzE6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIzMjoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184MSk7CiAgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTM0NTExLDIyICszNDU1NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMzM6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18yX19JbXBsIDogKCAneycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjM5OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCA6ICggJ3snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMzc6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDIzODoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyNDM6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI0NDoxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyMzg6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjM5OjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjQ0OjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI0NToyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDYwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDYxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzQ1NTIsMTQgKzM0NTk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI0ODoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzMgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyNTQ6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI1MjoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjUzOjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI1ODoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjU5OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtMzQ1OTAsMzEgKzM0NjM2LDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI2MDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjY2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjY0OjE6ICggKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjY1OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyNzA6MTogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyNzE6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI2NToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjY2OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI3MToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjcyOjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI2NzoyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyNzM6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCApPwogICAgICAgICAgICAgaW50IGFsdDg4PTI7CiAgICAgICAgICAgICBpbnQgTEE4OF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTg4XzA+PVJVTEVfSUQgJiYgTEE4OF8wPD1SVUxFX1NUUklORyl8fExBODhfMD09Mjd8fChMQTg4XzA+PTM0ICYmIExBODhfMDw9MzUpfHxMQTg4XzA9PTQwfHwoTEE4OF8wPj00NSAmJiBMQTg4XzA8PTUwKXx8TEE4OF8wPT02MHx8TEE4OF8wPT03OHx8KExBODhfMD49ODIgJiYgTEE4OF8wPD04Myl8fExBODhfMD09ODZ8fExBODhfMD09ODh8fChMQTg4XzA+PTkxICYmIExBODhfMDw9OTkpfHxMQTg4XzA9PTEwMXx8TEE4OF8wPT0xMTApICkgeworICAgICAgICAgICAgaWYgKCAoKExBODhfMD49UlVMRV9JRCAmJiBMQTg4XzA8PVJVTEVfU1RSSU5HKXx8TEE4OF8wPT0yN3x8KExBODhfMD49MzQgJiYgTEE4OF8wPD0zNSl8fExBODhfMD09NDB8fChMQTg4XzA+PTQ1ICYmIExBODhfMDw9NTApfHxMQTg4XzA9PTYxfHxMQTg4XzA9PTc5fHwoTEE4OF8wPj04MyAmJiBMQTg4XzA8PTg0KXx8TEE4OF8wPT04N3x8TEE4OF8wPT04OXx8KExBODhfMD49OTIgJiYgTEE4OF8wPD0xMDApfHxMQTg4XzA9PTEwMnx8TEE4OF8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDg4PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDg4KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjY3OjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI3MzozOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCgpOwpAQCAtMzQ2NTIsMTQgKzM0Njk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI3NToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI4MToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzQgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyNzk6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjgwOjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjg1OjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI4NjoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX180X19JbXBsKCk7CkBAIC0zNDY4NSwyMiArMzQ3MzEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjg2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA6ICggJ30nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI5MjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOiAoICd9JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjkwOjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyOTE6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjk2OjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyOTc6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMjkxOjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI5MjoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDI5NzoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAyOTg6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzQ3MjYsMTQgKzM0NzcyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzAyOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMwODoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMDY6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMDc6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMxMjoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMxMzoyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwoKTsKQEAgLTM0NzY0LDIzICszNDgxMCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMxNDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMyMDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMxODoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzE5OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMyNDoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzI1OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMxOToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMjA6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMjU6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzI2OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzIxOjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzIxOjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMjc6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMjc6MzogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAoKTsKQEAgLTM0ODE1LDE0ICszNDg2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDMyOToxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMSA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMzU6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzEgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzMzOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzM0OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzMzk6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNDA6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTM0ODQ4LDM1ICszNDg5NCwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM0MDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM0NjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM0NDoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzQ1OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM1MDoxOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzUxOjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM0NToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNDY6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNTE6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzUyOjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNDc6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNTM6MjogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqCiAgICAgICAgICAgICBsb29wODk6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDg5PTI7CiAgICAgICAgICAgICAgICAgaW50IExBODlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE4OV8wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE4OV8wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDg5PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDg5KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzQ3OjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzUzOjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAoKTsKQEAgLTM0OTE3LDE0ICszNDk2MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzU2OjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM2MjoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wIDogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM2MDoxOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNjE6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNjY6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzY3OjI6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCgpOwpAQCAtMzQ5NTUsMjIgKzM1MDAxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNjg6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM3NDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNzI6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM3MzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNzg6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM3OToxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzNzM6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzc0OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzc5OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM4MDoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM0OTk2LDE0ICszNTA0MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzgzOjE6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEgOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzODk6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzg3OjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzODg6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzkzOjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzOTQ6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC0zNTAyOSwyMyArMzUwNzUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM5NDoxOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0MDA6MTogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTAzOTg6MTogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwMzk5OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDA0OjE6ICggKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQwNToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDM5OToxOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQwMDoyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDA1OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDA2OjI6ICggcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQwMToyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDAxOjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQwNzoyOiAoIHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDA3OjM6IHJ1bGVfX1hTZXRMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpOwpAQCAtMzUwODAsMTQgKzM1MTI2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0MTA6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDE2OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDE0OjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQxNToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQyMDoxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0MjE6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180NCk7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsKCk7CkBAIC0zNTExOCwyMyArMzUxNjQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQyMjoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0Mjg6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0MjY6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDI3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDMyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQzMzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQyNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQyODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDMzOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDM0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQyOToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDI5OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDM1OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0MzU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTM1MTU5LDE0ICszNTIwNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDM3OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ0MzoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ0MToxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NDI6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NDc6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDQ4OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDUpOwogICAgICAgICAgICAgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMzUxOTcsMjIgKzM1MjQzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NDk6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggJyMnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ1NToxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAnIycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NTM6MTogKCAoICcjJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ1NDoxOiAoICcjJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NTk6MTogKCAoICcjJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ2MDoxOiAoICcjJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NTQ6MTogKCAnIycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDU1OjI6ICcjJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDYwOjE6ICggJyMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ2MToyOiAnIycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zNTIzOCwxNCArMzUyODQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ2NDoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0NzA6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMiA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0Njg6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDY5OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDc0OjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ3NToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQzKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTM1Mjc2LDIyICszNTMyMiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDc2OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgOiAoICdbJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0ODI6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCA6ICggJ1snICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDgwOjE6ICggKCAnWycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0ODE6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDg2OjE6ICggKCAnWycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0ODc6MTogKCAnWycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDgxOjE6ICggJ1snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ4MjoyOiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ4NzoxOiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0ODg6MjogJ1snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDg0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC0zNTMxNywxNCArMzUzNjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ5MToxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0OTc6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA0OTU6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDk2OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTAxOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUwMjoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQzKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTM1MzU1LDMxICszNTQwMSwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTAzOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUwOToxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUwNzoxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MDg6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MTM6MTogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTE0OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTA4OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTA5OjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MTQ6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MTU6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MTA6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUxNjoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCApPwogICAgICAgICAgICAgaW50IGFsdDkwPTI7CiAgICAgICAgICAgICBpbnQgTEE5MF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTkwXzA+PVJVTEVfSUQgJiYgTEE5MF8wPD1SVUxFX1NUUklORyl8fExBOTBfMD09Mjd8fChMQTkwXzA+PTM0ICYmIExBOTBfMDw9MzUpfHxMQTkwXzA9PTQwfHwoTEE5MF8wPj00NSAmJiBMQTkwXzA8PTUwKXx8TEE5MF8wPT02MHx8TEE5MF8wPT03OHx8KExBOTBfMD49ODIgJiYgTEE5MF8wPD04Myl8fExBOTBfMD09ODZ8fExBOTBfMD09ODh8fChMQTkwXzA+PTkxICYmIExBOTBfMDw9OTkpfHxMQTkwXzA9PTEwMXx8TEE5MF8wPT0xMTApICkgeworICAgICAgICAgICAgaWYgKCAoKExBOTBfMD49UlVMRV9JRCAmJiBMQTkwXzA8PVJVTEVfU1RSSU5HKXx8TEE5MF8wPT0yN3x8KExBOTBfMD49MzQgJiYgTEE5MF8wPD0zNSl8fExBOTBfMD09NDB8fChMQTkwXzA+PTQ1ICYmIExBOTBfMDw9NTApfHxMQTkwXzA9PTYxfHxMQTkwXzA9PTc5fHwoTEE5MF8wPj04MyAmJiBMQTkwXzA8PTg0KXx8TEE5MF8wPT04N3x8TEE5MF8wPT04OXx8KExBOTBfMD49OTIgJiYgTEE5MF8wPD0xMDApfHxMQTkwXzA9PTEwMnx8TEE5MF8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDkwPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkwKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTEwOjM6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MTY6MzogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCgpOwpAQCAtMzU0MTcsMTQgKzM1NDYzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MTg6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUyNDoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180IDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MjI6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUyMzoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1Mjg6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUyOToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTM1NDUwLDIyICszNTQ5NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTI5OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgOiAoICddJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MzU6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCA6ICggJ10nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTMzOjE6ICggKCAnXScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1MzQ6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTM5OjE6ICggKCAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NDA6MTogKCAnXScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTM0OjE6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDUzNToyOiAnXScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU0MDoxOiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NDE6MjogJ10nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM1NDkxLDE0ICszNTUzNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NDU6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTUxOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NDk6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU1MDoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NTU6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU1NjoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwoKTsKQEAgLTM1NTI5LDIzICszNTU3NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NTc6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU2MzoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzBfX0ltcGwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU2MToxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU2MjoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTY3OjE6ICggKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTY4OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NjI6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU2MzoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1Njg6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU2OToyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTY0OjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU2NDozOiBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU3MDoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NzA6MzogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCgpOwpAQCAtMzU1ODAsMTQgKzM1NjI2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU3MjoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU3ODoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzEgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1NzY6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTc3OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTgyOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU4MzoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsKCk7CkBAIC0zNTYxMywzNSArMzU2NTksMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTgzOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1ODk6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1ODc6MTogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1ODg6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU5MzoxOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU5NDoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTg4OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1ODk6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTk0OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1OTU6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTkwOjI6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU5NjoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wICkqCiAgICAgICAgICAgICBsb29wOTE6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDkxPTI7CiAgICAgICAgICAgICAgICAgaW50IExBOTFfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE5MV8wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE5MV8wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDkxPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkxKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNTkwOjM6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU5NjozOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAoKTsKQEAgLTM1NjgyLDE0ICszNTcyOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDU5OToxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMCA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MDU6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAgOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjAzOjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjA0OjI6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MDk6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MTA6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wX19JbXBsKCk7CkBAIC0zNTcyMCwyMiArMzU3NjYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MTE6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MTc6MTogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MTU6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDYxNjoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MjE6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDYyMjoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MTY6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjE3OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjIyOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDYyMzoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzU3NjEsMTQgKzM1ODA3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjI2OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xIDogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDYzMjoxOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MzA6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2MzE6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDYzNjoxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDYzNzoyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwXzNfMV9fMV9fSW1wbCgpOwpAQCAtMzU3OTQsMjMgKzM1ODQwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjM3OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjQzOjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjQxOjE6ICggKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NDI6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjQ3OjE6ICggKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NDg6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjQyOjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY0MzoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY0ODoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NDk6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NDQ6MjogKCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NDQ6MzogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY1MDoyOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY1MDozOiBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpOwpAQCAtMzU4NDUsMTQgKzM1ODkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY1MzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NTk6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY1NzoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjU4OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY2MzoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjY0OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMzU4ODMsMjMgKzM1OTI5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY2NToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NzE6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY2OToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjcwOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY3NToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjc2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY3MDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NzE6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2NzY6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjc3OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjcyOjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjcyOjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2Nzg6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2Nzg6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAoKTsKQEAgLTM1OTM0LDE0ICszNTk4MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2ODA6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjg2OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMSA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2ODQ6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY4NToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OTA6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY5MToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Mik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTM1OTcyLDI3ICszNjAxOCwyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OTI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY5ODoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY5NjoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY5NzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzAyOjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzAzOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OTc6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY5ODoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MDM6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDcwNDoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OTk6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzA1OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ5Mj0yOwogICAgICAgICAgICAgYWx0OTIgPSBkZmE5Mi5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OTk6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzA1OjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wKCk7CkBAIC0zNjAzMCwxNCArMzYwNzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzA3OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMiA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDcxMzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzIgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzExOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MTI6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzE3OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MTg6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODMpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18yX19JbXBsKCk7CkBAIC0zNjA2OCwyMyArMzYxMTQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzE5OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDcyNToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzIzOjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MjQ6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzI5OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MzA6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzI0OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDcyNToyOiAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDczMDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MzE6MjogKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MjY6MjogKCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MjY6MzogcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDczMjoyOiAoIHJ1bGVfX1hDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDczMjozOiBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpOwpAQCAtMzYxMTksMTQgKzM2MTY1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDczNDoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc0MDoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzMgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3Mzg6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzM5OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzQ0OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc0NToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18zX19JbXBsKCk7CkBAIC0zNjE1MiwyMiArMzYxOTgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzQ1OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fM19fSW1wbCA6ICggJ10nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc1MToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwgOiAoICddJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzQ5OjE6ICggKCAnXScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3NTA6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzU1OjE6ICggKCAnXScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3NTY6MTogKCAnXScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzUwOjE6ICggJ10nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc1MToyOiAnXScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc1NjoxOiAoICddJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3NTc6MjogJ10nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9CkBAIC0zNjE5MywxNCArMzYyMzksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3NjE6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzY3OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc2NToxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc2NjoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzcxOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzcyOjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsKCk7CkBAIC0zNjIyNiwyMyArMzYyNzIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3NzI6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc3ODoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzc2OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc3NzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc4MjoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3ODM6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3Nzc6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3Nzg6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc4MzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc4NDoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3Nzk6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc3OTozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3ODU6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc4NTozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAoKTsKQEAgLTM2Mjc3LDE0ICszNjMyMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzg4OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc5NDoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc5MjoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3OTM6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3OTg6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzk5OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDUpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCgpOwpAQCAtMzYzMTUsMjMgKzM2MzYxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MDA6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODA2OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODA0OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgwNToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgxMDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MTE6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MDU6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MDY6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgxMToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgxMjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldFhDbG9zdXJlQWN0aW9uXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgwNzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODA3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODEzOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MTM6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTM2MzU2LDE0ICszNjQwMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODE1OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MjE6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMSA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODE5OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MjA6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODI1OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MjY6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsKCk7CkBAIC0zNjM4OSwyMiArMzY0MzUsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgyNjoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAnWycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODMyOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICdbJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgzMDoxOiAoICggJ1snICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODMxOjE6ICggJ1snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgzNjoxOiAoICggJ1snICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODM3OjE6ICggJ1snICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDgzMToxOiAoICdbJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4MzI6MjogJ1snCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4Mzc6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODM4OjI6ICdbJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzY0MzAsMTQgKzM2NDc2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODQyOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg0ODoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NDY6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NDc6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg1MjoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg1MzoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtMzY0NjMsMjMgKzM2NTA5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODUzOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NTk6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg1NzoxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NTg6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NjM6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODY0OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODU4OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODU5OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NjQ6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NjU6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODYwOjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NjA6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODY2OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NjY6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wKCk7CkBAIC0zNjUxNCwxNCArMzY1NjAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg2OToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NzU6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4NzM6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODc0OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODc5OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg4MDoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg0KTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwoKTsKQEAgLTM2NTUyLDMxICszNjU5OCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODgxOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg4NzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg4NToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4ODY6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4OTE6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODkyOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODg2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODg3OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4OTI6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4OTM6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4ODg6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg5NDoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCApPwogICAgICAgICAgICAgaW50IGFsdDkzPTI7CiAgICAgICAgICAgICBpbnQgTEE5M18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBOTNfMD09UlVMRV9JRHx8TEE5M18wPT0zMXx8TEE5M18wPT03OCkgKSB7CisgICAgICAgICAgICBpZiAoIChMQTkzXzA9PVJVTEVfSUR8fExBOTNfMD09MzF8fExBOTNfMD09NzkpICkgewogICAgICAgICAgICAgICAgIGFsdDkzPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkzKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwODg4OjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4OTQ6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCgpOwpAQCAtMzY2MTQsMTQgKzM2NjYwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4OTY6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMSA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkwMjoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MDA6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkwMToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MDY6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkwNzoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzFfX0ltcGwoKTsKQEAgLTM2NjQ3LDIzICszNjY5MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTA3OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkxMzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkxMToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MTI6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MTc6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTE4OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTEyOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTEzOjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MTg6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MTk6MjogKCBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTE0OjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MTQ6MzogcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTIwOjI6ICggcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MjA6MzogcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xKCk7CkBAIC0zNjY5OCwxNCArMzY3NDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTIzOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMCA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkyOToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTI3OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5Mjg6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTMzOjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5MzQ6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzkpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsKCk7CkBAIC0zNjczNiwyMyArMzY3ODIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTM1OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTQxOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDkzOToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NDA6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NDU6MTogKCAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTQ2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTQwOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTQxOjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NDY6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NDc6MjogKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTQyOjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NDI6MzogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTQ4OjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NDg6MzogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wKCk7CkBAIC0zNjc4NywxNCArMzY4MzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTUwOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTU2OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMSA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk1NDoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NTU6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NjA6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTYxOjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTM2ODIwLDM1ICszNjg2NiwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NjE6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk2NzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk2NToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk2NjoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTcxOjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTcyOjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NjY6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk2NzoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5NzI6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk3MzoyOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5Njg6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTc0OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3A5NDoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0OTQ9MjsKICAgICAgICAgICAgICAgICBpbnQgTEE5NF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTk0XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTk0XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0OTQ9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OTQpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5Njg6MzogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTc0OjM6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCgpOwpAQCAtMzY4ODksMTQgKzM2OTM1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTc3OjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk4MzoxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCA6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5ODE6MTogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5ODI6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk4NzoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk4ODoyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMF9fSW1wbCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzBfX0ltcGwoKTsKQEAgLTM2OTI3LDIyICszNjk3MywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk4OToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk5NToxOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk5MzoxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwOTk0OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk5OToxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDAwOjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk5NDoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA5OTU6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMDA6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDAxOjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzBfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zNjk2OCwxNCArMzcwMTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMDQ6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzEgOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDEwOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xIDogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAwODoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAwOToyOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDE0OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDE1OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xX19JbXBsKCk7CkBAIC0zNzAwMSwyMyArMzcwNDcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMTU6MTogcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDIxOjE6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAxOToxOiAoICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAyMDoxOiAoICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDI1OjE6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDI2OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMjA6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAyMToyOiAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMjY6MTogKCAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAyNzoyOiAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDIyOjI6ICggcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAyMjozOiBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAyODoyOiAoIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMjg6MzogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSgpOwpAQCAtMzcwNTIsMTQgKzM3MDk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAzMToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwMzc6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTAzNToxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDM2OjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA0MToxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDQyOjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgyKTsKICAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMzcwOTAsMjMgKzM3MTM2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA0MzoxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA0OToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwNDc6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDQ4OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDUzOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA1NDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA0ODoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA0OToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDU0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDU1OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA1MDoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDUwOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDU2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwNTY6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTM3MTMxLDE0ICszNzE3NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwNTg6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwNjQ6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDYyOjE6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA2MzoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA2ODoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwNjk6MjogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtMzcxNjQsMzUgKzM3MjEwLDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA2OToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDc1OjE6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDczOjE6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDc0OjE6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwNzk6MTogKCAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwODA6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA3NDoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDc1OjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA4MDoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDgxOjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA3NjoyOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwODI6MjogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgbG9vcDk1OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQ5NT0yOwogICAgICAgICAgICAgICAgIGludCBMQTk1XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKChMQTk1XzA+PVJVTEVfSUQgJiYgTEE5NV8wPD1SVUxFX1NUUklORyl8fExBOTVfMD09Mjd8fChMQTk1XzA+PTM0ICYmIExBOTVfMDw9MzUpfHxMQTk1XzA9PTQwfHwoTEE5NV8wPj00NCAmJiBMQTk1XzA8PTUwKXx8TEE5NV8wPT02MHx8TEE5NV8wPT03OHx8KExBOTVfMD49ODIgJiYgTEE5NV8wPD04Myl8fExBOTVfMD09ODZ8fExBOTVfMD09ODh8fChMQTk1XzA+PTkxICYmIExBOTVfMDw9OTkpfHxMQTk1XzA9PTEwMXx8KExBOTVfMD49MTA5ICYmIExBOTVfMDw9MTEwKSkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoKExBOTVfMD49UlVMRV9JRCAmJiBMQTk1XzA8PVJVTEVfU1RSSU5HKXx8TEE5NV8wPT0yN3x8KExBOTVfMD49MzQgJiYgTEE5NV8wPD0zNSl8fExBOTVfMD09NDB8fChMQTk1XzA+PTQ0ICYmIExBOTVfMDw9NTApfHxMQTk1XzA9PTYxfHxMQTk1XzA9PTc5fHwoTEE5NV8wPj04MyAmJiBMQTk1XzA8PTg0KXx8TEE5NV8wPT04N3x8TEE5NV8wPT04OXx8KExBOTVfMD49OTIgJiYgTEE5NV8wPD0xMDApfHxMQTk1XzA9PTEwMnx8KExBOTVfMD49MTEwICYmIExBOTVfMDw9MTExKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk1PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDk1KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDc2OjM6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA4MjozOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzg1KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAoKTsKQEAgLTM3MjMzLDE0ICszNzI3OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTA4NToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwOTE6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAgOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDg5OjE6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMDkwOjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwOTU6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwOTY6MjogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzMzKTsKICAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18wX19JbXBsKCk7CkBAIC0zNzI3MSwyMyArMzczMTcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEwOTc6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMDM6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMDE6MTogKCAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEwMjoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMDc6MTogKCAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEwODoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMDI6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTAzOjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTA4OjE6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEwOToyOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEwNDoyOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEwNDozOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTEwOjI6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTEwOjM6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wKCk7CkBAIC0zNzMyMiwxNCArMzczNjgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMTI6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzEgOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTE4OjE6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xIDogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTExNjoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTExNzoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTIyOjE6ICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTIzOjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC0zNzM1NSwzMyArMzc0MDEsMzMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMjM6MTogcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggJzsnICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEyOToxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCAnOycgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTI3OjE6ICggKCAoICc7JyApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEyODoxOiAoICggJzsnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEzMzoxOiAoICggKCAnOycgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMzQ6MTogKCAoICc7JyApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMjg6MTogKCAoICc7JyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMjk6MjogKCAnOycgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEzNDoxOiAoICggJzsnICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEzNToyOiAoICc7JyApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEzMDoyOiAoICc7JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTM2OjI6ICggJzsnICk/CiAgICAgICAgICAgICBpbnQgYWx0OTY9MjsKICAgICAgICAgICAgIGludCBMQTk2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEE5Nl8wPT03NikgKSB7CisgICAgICAgICAgICBpZiAoIChMQTk2XzA9PTc3KSApIHsKICAgICAgICAgICAgICAgICBhbHQ5Nj0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ5NikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTEzMDozOiAnOycKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTM2OjM6ICc7JwogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNzQxMywxNCArMzc0NTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExMzk6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTQ1OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE0MzoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE0NDoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTQ5OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTUwOjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMzc0NTEsMjMgKzM3NDk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTUxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNTc6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE1NToxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNTY6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNjE6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTYyOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTU2OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTU3OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNjI6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNjM6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTU4OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNTg6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTY0OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNjQ6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wKCk7CkBAIC0zNzUwMiwxNCArMzc1NDgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNjY6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTcyOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE3MDoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE3MToyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTc2OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTc3OjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zNzUzNSwyMyArMzc1ODEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExNzc6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE4MzoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTgxOjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE4MjoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE4NzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExODg6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExODI6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExODM6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE4ODoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE4OToyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExODQ6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE4NDozOiBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExOTA6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTE5MDozOiBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzEoKTsKQEAgLTM3NTg2LDE0ICszNzYzMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTkzOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExOTk6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMTk3OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTExOTg6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjAzOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMDQ6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsKCk7CkBAIC0zNzYxOSwyMyArMzc2NjUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIwNDoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIxMDoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjA4OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjA5OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMTQ6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMTU6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIwOToxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjEwOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIxNToxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjE2OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMTE6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjExOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjE3OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIxNzozOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wKCk7CkBAIC0zNzY3MCwxNCArMzc3MTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjIwOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIyNjoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjI0OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMjU6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjMwOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMzE6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODQpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsKCk7CkBAIC0zNzcwOCwyMyArMzc3NTQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjMyOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjM4OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIzNjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyMzc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNDI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjQzOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjM3OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjM4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNDM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNDQ6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldFhDbG9zdXJlQWN0aW9uXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTIzOToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjM5OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjQ1OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNDU6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTM3NzQ5LDE0ICszNzc5NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNDc6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjUzOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMSA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNTE6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI1MjoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNTc6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI1ODoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184NCk7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwoKTsKQEAgLTM3Nzg3LDMxICszNzgzMywzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNTk6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI2NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI2MzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI2NDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjY5OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjcwOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNjQ6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI2NToyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNzA6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI3MToyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNjY6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjcyOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQ5Nz0yOwogICAgICAgICAgICAgaW50IExBOTdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTk3XzA9PVJVTEVfSUR8fExBOTdfMD09MzF8fExBOTdfMD09NzgpICkgeworICAgICAgICAgICAgaWYgKCAoTEE5N18wPT1SVUxFX0lEfHxMQTk3XzA9PTMxfHxMQTk3XzA9PTc5KSApIHsKICAgICAgICAgICAgICAgICBhbHQ5Nz0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ5NykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI2NjozOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNzI6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAoKTsKQEAgLTM3ODQ5LDE0ICszNzg5NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyNzQ6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyODA6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjc4OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI3OToyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI4NDoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyODU6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbCgpOwpAQCAtMzc4ODIsMjMgKzM3OTI4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI4NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjkxOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMl9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjg5OjE6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjkwOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyOTU6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyOTY6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI5MDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjkxOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI5NjoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjk3OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEyOTI6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjkyOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMjk4OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTI5ODozOiBydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yKCk7CkBAIC0zNzkzMywxNCArMzc5NzksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMDE6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzAgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzA3OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMwNToxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMwNjoyOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzExOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzEyOjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMF9fSW1wbCgpOwpAQCAtMzc5NzEsMjMgKzM4MDE3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzEzOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMxOToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMTc6MTogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMTg6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMyMzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMyNDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzE4OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMTk6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzI0OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMjU6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMyMDoyOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMjA6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMjY6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzI2OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKTsKQEAgLTM4MDIyLDE0ICszODA2OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMyODoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMSA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMzQ6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzMyOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzMzOjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMzg6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzMzk6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfXzFfX0ltcGwoKTsKQEAgLTM4MDU1LDM1ICszODEwMSwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTMzOToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM0NToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM0MzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzQ0OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM0OToxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzUwOjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM0NDoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNDU6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNTA6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzUxOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNDY6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNTI6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wICkqCiAgICAgICAgICAgICBsb29wOTg6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDk4PTI7CiAgICAgICAgICAgICAgICAgaW50IExBOThfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEE5OF8wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEE5OF8wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDk4PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDk4KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzQ2OjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzUyOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAoKTsKQEAgLTM4MTI0LDE0ICszODE3MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzU1OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzAgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM2MToxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wIDogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM1OToxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNjA6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNjU6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzY2OjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCgpOwpAQCAtMzgxNjIsMjIgKzM4MjA4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNjc6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM3MzoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNzE6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM3MjoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNzc6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM3ODoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzNzI6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzczOjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzc4OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM3OToyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM4MjAzLDE0ICszODI0OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzgyOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEgOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzODg6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMSA6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzg2OjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzODc6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzkyOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzOTM6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsKCk7CkBAIC0zODIzNiwyMyArMzgyODIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM5MzoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzk5OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM5NzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExMzk4OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQwMzoxOiAoICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDA0OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTM5ODoxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTEzOTk6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MDQ6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDA1OjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDAwOjI6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDAwOjM6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MDY6MjogKCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MDY6MzogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKTsKQEAgLTM4Mjg3LDE0ICszODMzMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDA5OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQxNToxOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQxMzoxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MTQ6MjogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MTk6MTogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDIwOjI6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMzgzMjUsMjIgKzM4MzcxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MjE6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQyNzoxOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAnKCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MjU6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQyNjoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MzE6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQzMjoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MjY6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDI3OjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDMyOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQzMzoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzgzNjYsMTQgKzM4NDEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0MzY6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDQyOjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDQwOjE6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ0MToyOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ0NjoxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0NDc6MjogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zODQwNCwxNyArMzg0NTAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ0ODoxOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDU0OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ1MjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDUzOjE6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ1ODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDU5OjE6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ1MzoxOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0NTQ6MjogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0NTk6MTogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDYwOjI6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IApAQCAtMzg0NDksMTQgKzM4NDk1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0NjM6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ2OToxOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0Njc6MTogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ2ODoyOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0NzM6MTogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ3NDoyOiBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTM4NDgyLDIyICszODUyOCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDc0OjE6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0ODA6MTogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDc4OjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0Nzk6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDg0OjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0ODU6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDc5OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ4MDoyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ4NToxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0ODY6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzg1MjMsMTQgKzM4NTY5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNDkwOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTQ5NjoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0OTQ6MTogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE0OTU6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUwMDoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUwMToyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODcpOwogICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTM4NTYxLDIzICszODYwNywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUwMjoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTA4OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1MDY6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTA3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTEyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUxMzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUwNzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUwODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTEzOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTE0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSWZFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTA5OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1MDk6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1MTU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUxNTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtMzg2MDIsMTQgKzM4NjQ4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTE3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUyMzoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1MjE6MTogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1MjI6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUyNzoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUyODoyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzcpOwogICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTM4NjQwLDIyICszODY4NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUyOToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ2lmJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1MzU6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICdpZicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTMzOjE6ICggKCAnaWYnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTM0OjE6ICggJ2lmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1Mzk6MTogKCAoICdpZicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1NDA6MTogKCAnaWYnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTUzNDoxOiAoICdpZicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTM1OjI6ICdpZicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU0MDoxOiAoICdpZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTQxOjI6ICdpZicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDg2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtMzg2ODEsMTQgKzM4NzI3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTQ0OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU1MDoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1NDg6MTogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1NDk6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU1NDoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU1NToyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTM4NzE5LDIyICszODc2NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU1NjoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU2MjoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU2MDoxOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTYxOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU2NjoxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTY3OjE6ICggJygnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU2MToxOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1NjI6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1Njc6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTY4OjI6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM4NzYwLDE0ICszODgwNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU3MToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1Nzc6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTc1OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTc2OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1ODE6MTogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1ODI6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg2KTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC0zODc5OCwyMyArMzg4NDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1ODM6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1ODk6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1ODc6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU4ODoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1OTM6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU5NDoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1ODg6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTg5OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTk0OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU5NToyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmQXNzaWdubWVudF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU5MDoyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTU5MDozOiBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTk2OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNTk2OjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zKCk7CkBAIC0zODg0OSwxNCArMzg4OTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE1OTg6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjA0OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTYwMjoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTYwMzoyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjA4OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjA5OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtMzg4ODcsMjIgKzM4OTMzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjEwOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjE2OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjE0OjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2MTU6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjIwOjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2MjE6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjE1OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTYxNjoyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTYyMToxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2MjI6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC0zODkyOCwxNCArMzg5NzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2MjU6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjMxOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181IDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzYgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTYyOToxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTYzMDoyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjM1OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjM2OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184OCk7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpOwpAQCAtMzg5NjYsMjMgKzM5MDEyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjM3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NDM6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY0MToxOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NDI6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NDc6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjQ4OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjQyOjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjQzOjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NDg6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX1RoZW5Bc3NpZ25tZW50XzUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NDk6MjogKCBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFRoZW5Bc3NpZ25tZW50XzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjQ0OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NDQ6MzogcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjUwOjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NTA6MzogcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81KCk7CkBAIC0zOTAxNywxNCArMzkwNjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NTI6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzYgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjU4OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY1NjoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY1NzoyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjYyOjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjYzOjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCk7CkBAIC0zOTA1MCwzNSArMzkwOTYsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NjM6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2Njk6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2Njc6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY2ODoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NzM6MTogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY3NDoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2Njg6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjY5OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjc0OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY3NToyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjcwOjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjc2OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApPwogICAgICAgICAgICAgaW50IGFsdDk5PTI7CiAgICAgICAgICAgICBpbnQgTEE5OV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBOTlfMD09ODcpICkgeworICAgICAgICAgICAgaWYgKCAoTEE5OV8wPT04OCkgKSB7CiAgICAgICAgICAgICAgICAgaW50IExBOTlfMSA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE0N19JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNDhfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0OTk9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDk5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjcwOjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjc2OjM6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCgpOwpAQCAtMzkxMTYsMTQgKzM5MTYyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2Nzk6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCA6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjg1OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjgzOjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY4NDoyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY4OToxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzBfX0ltcGwgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2OTA6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMF9fSW1wbCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsKCk7CkBAIC0zOTE1NCwyNSArMzkyMDAsMjUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY5MToxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIDogKCAoICdlbHNlJyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY5NzoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wX19JbXBsIDogKCAoICdlbHNlJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjk1OjE6ICggKCAoICdlbHNlJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjk2OjE6ICggKCAnZWxzZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3MDE6MTogKCAoICggJ2Vsc2UnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3MDI6MTogKCAoICdlbHNlJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY5NjoxOiAoICggJ2Vsc2UnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjk3OjI6ICggJ2Vsc2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcwMjoxOiAoICggJ2Vsc2UnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzAzOjI6ICggJ2Vsc2UnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldEVsc2VLZXl3b3JkXzZfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2OTg6MjogKCAnZWxzZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjk4OjM6ICdlbHNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzA0OjI6ICggJ2Vsc2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcwNDozOiAnZWxzZScKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDg3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDg4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgfQogCkBAIC0zOTIwMSwxNCArMzkyNDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcwNjoxOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xIDogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzEyOjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzEgOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcxMDoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzExOjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcxNjoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzE3OjI6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCgpOwpAQCAtMzkyMzQsMjMgKzM5MjgwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3MTc6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCA6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3MjM6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMV9fSW1wbCA6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcyMToxOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcyMjoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzI3OjE6ICggKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzI4OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3MjI6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcyMzoyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3Mjg6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcyOToyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlQXNzaWdubWVudF82XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzI0OjI6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTcyNDozOiBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTczMDoyOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3MzA6MzogcnVsZV9fWElmRXhwcmVzc2lvbl9fRWxzZUFzc2lnbm1lbnRfNl8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSgpOwpAQCAtMzkyODUsMTQgKzM5MzMxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTczMzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3Mzk6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTczNzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzM4OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc0MzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzQ0OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzg5KTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtMzkzMjMsMjMgKzM5MzY5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc0NToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc1MToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3NDk6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzUwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzU1OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc1NjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc1MDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc1MToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzU2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzU3OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3NTI6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc1MjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc1ODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzU4OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC0zOTM2NCwxNCArMzk0MTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzYwOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc2NjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzY0OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3NjU6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzcwOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3NzE6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC0zOTQwMiwyMiArMzk0NDgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzcyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3N3aXRjaCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzc4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3N3aXRjaCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc3NjoxOiAoICggJ3N3aXRjaCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3Nzc6MTogKCAnc3dpdGNoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3ODI6MTogKCAoICdzd2l0Y2gnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzgzOjE6ICggJ3N3aXRjaCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzc3OjE6ICggJ3N3aXRjaCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzc4OjI6ICdzd2l0Y2gnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3ODM6MTogKCAnc3dpdGNoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3ODQ6MjogJ3N3aXRjaCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3dpdGNoS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM5NDQzLDE0ICszOTQ4OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3ODc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNzkzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3OTE6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc5MjoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE3OTc6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc5ODoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184KTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtMzk0ODEsMjMgKzM5NTI3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTc5OToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODA1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODAzOjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODA0OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4MDk6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4MTA6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgwNDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODA1OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgxMDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODExOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4MDY6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODA2OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODEyOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgxMjozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yKCk7CkBAIC0zOTUzMiwxNCArMzk1NzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODE0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgyMDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODE4OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4MTk6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODI0OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4MjU6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTEpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC0zOTU3MCwyMiArMzk2MTYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODI2OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggJ3snICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgzMjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODMwOjE6ICggKCAneycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4MzE6MTogKCAneycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODM2OjE6ICggKCAneycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4Mzc6MTogKCAneycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODMxOjE6ICggJ3snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgzMjoyOiAneycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTgzNzoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4Mzg6MjogJ3snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTM5NjExLDE0ICszOTY1NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NDE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODQ3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NDU6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg0NjoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NTE6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg1MjoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185MSk7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTM5NjQ5LDM1ICszOTY5NSwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NTM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NTk6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODU3OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg1ODoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg2MzoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NjQ6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NTg6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NTk6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg2NDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80ICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg2NToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldENhc2VzQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg2MDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODY2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80ICkqCiAgICAgICAgICAgICBsb29wMTAwOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMDA9MjsKICAgICAgICAgICAgICAgICBpbnQgTEExMDBfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMDBfMD09UlVMRV9JRHx8TEExMDBfMD09MzF8fExBMTAwXzA9PTc4fHxMQTEwMF8wPT04MHx8KExBMTAwXzA+PTg5ICYmIExBMTAwXzA8PTkwKSkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMDBfMD09UlVMRV9JRHx8TEExMDBfMD09MzF8fExBMTAwXzA9PTc5fHxMQTEwMF8wPT04MXx8KExBMTAwXzA+PTkwICYmIExBMTAwXzA8PTkxKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDEwMD0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDApIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NjA6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80CisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg2NjozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV185Mik7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCgpOwpAQCAtMzk3MTgsMTQgKzM5NzY0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg2ODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4NzQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181IDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg3MjoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODczOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg3ODoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODc5OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpOwpAQCAtMzk3NTYsMzEgKzM5ODAyLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg4MDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODg2OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODg0OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODg1OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4OTA6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4OTE6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg4NToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODg2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg5MToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODkyOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg4NzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4OTM6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCApPwogICAgICAgICAgICAgaW50IGFsdDEwMT0yOwogICAgICAgICAgICAgaW50IExBMTAxXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMDFfMD09NzMpICkgeworICAgICAgICAgICAgaWYgKCAoTEExMDFfMD09NzQpICkgewogICAgICAgICAgICAgICAgIGFsdDEwMT0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMDEpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE4ODc6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODkzOjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wKCk7CkBAIC0zOTgxOCwxNCArMzk4NjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExODk1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTAxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTg5OToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MDA6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MDU6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTA2OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwoKTsKQEAgLTM5ODUxLDIyICszOTg5NywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MDY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTEyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCA6ICggJ30nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MTA6MTogKCAoICd9JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTkxMToxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MTY6MTogKCAoICd9JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTkxNzoxOiAoICd9JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MTE6MTogKCAnfScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTEyOjI6ICd9JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTE3OjE6ICggJ30nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTkxODoyOiAnfScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9CkBAIC0zOTg5MiwxNCArMzk5MzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTkyMjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5Mjg6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5MjY6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTI3OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTMyOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTkzMzoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwoKTsKQEAgLTM5OTMwLDIzICszOTk3NiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTM0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTQwOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5Mzg6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5Mzk6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk0NDoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk0NToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTM5OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NDA6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTQ1OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NDY6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk0MToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NDE6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NDc6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTQ3OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAoKTsKQEAgLTM5OTgxLDE0ICs0MDAyNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTQ5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk1NToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk1MzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NTQ6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NTk6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTYwOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCgpOwpAQCAtNDAwMTksMjMgKzQwMDY1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NjE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk2NzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NjU6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk2NjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NzE6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk3MjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5NjY6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTY3OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTcyOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk3MzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hBc3NpZ25tZW50XzJfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk2ODoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk2ODozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzBfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTc0OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTc0OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xKCk7CkBAIC00MDA3MCwxNCArNDAxMTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk3NjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTgyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk4MDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTgxOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk4NjoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTg3OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCgpOwpAQCAtNDAxMDMsMjIgKzQwMTQ5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5ODc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk5MzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5OTE6MTogKCAoICcpJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk5MjoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5OTc6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk5ODoxOiAoICcpJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE5OTI6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTkzOjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExOTk4OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTk5OToyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC00MDE0NCwxNCArNDAxOTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDAzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDA5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAwNzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMDg6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMTM6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDE0OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwoKTsKQEAgLTQwMTc3LDIzICs0MDIyMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMTQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDIwOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMTg6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAxOToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMjQ6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAyNToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMTk6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDIwOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDI1OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAyNjoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAyMToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAyMTozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDI3OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDI3OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wKCk7CkBAIC00MDIyOCwxNCArNDAyNzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwMzA6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDM2OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAzNDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjAzNToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDQwOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDQxOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OCk7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMF9fSW1wbCgpOwpAQCAtNDAyNjYsMjIgKzQwMzEyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDQyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDQ4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wX19JbXBsIDogKCAnKCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDQ2OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwNDc6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDUyOjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwNTM6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDQ3OjE6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA0ODoyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA1MzoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwNTQ6MjogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yXzBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDAzMDcsMTQgKzQwMzUzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDU3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA2MzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwNjE6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwNjI6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA2NzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA2ODoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTMpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzFfX0ltcGwoKTsKQEAgLTQwMzQ1LDIzICs0MDM5MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA2OToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDc1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwNzM6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDc0OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDc5OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA4MDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA3NDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA3NToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDgwOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDgxOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA3NjoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDc2OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA4MjoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDgyOjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpOwpAQCAtNDAzOTYsMTQgKzQwNDQyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDg0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA5MDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwODg6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIwODk6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA5NDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjA5NToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMl9fSW1wbCgpOwpAQCAtNDA0MjksMjIgKzQwNDc1LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDk1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yX19JbXBsIDogKCAnOicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTAxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18yX19JbXBsIDogKCAnOicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF8wXzBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMDk5OjE6ICggKCAnOicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMDA6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTA1OjE6ICggKCAnOicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMDY6MTogKCAnOicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTAwOjE6ICggJzonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEwMToyOiAnOicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEwNjoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMDc6MjogJzonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMl8wXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQwNDcwLDE0ICs0MDUxNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTExOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjExNzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjExNToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMTY6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMjE6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTIyOjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTApOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCgpOwpAQCAtNDA1MDgsMjcgKzQwNTU0LDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMjM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTI5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTI3OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEyODoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzMzoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMzQ6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMjg6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMjk6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzNDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzNToyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzMDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTM2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0MTAyPTI7CiAgICAgICAgICAgICBhbHQxMDIgPSBkZmExMDIucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwMikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzMDozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTM2OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAoKTsKQEAgLTQwNTY2LDE0ICs0MDYxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTM4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNDQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMSA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTQyOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNDM6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTQ4OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNDk6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsKCk7CkBAIC00MDU5OSwyMyArNDA2NDUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE0OToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTU1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE1MzoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTU0OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE1OToxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTYwOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE1NDoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNTU6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNjA6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTYxOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEFzc2lnbm1lbnRfMl8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTU2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTU2OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNjI6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNjI6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEoKTsKQEAgLTQwNjUwLDE0ICs0MDY5NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNjU6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNzE6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTY5OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE3MDoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE3NToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxNzY6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMF9fSW1wbCgpOwpAQCAtNDA2ODMsMjMgKzQwNzI5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE3NjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxODI6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE4MDoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTgxOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE4NjoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTg3OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE4MToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxODI6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxODc6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTg4OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTgzOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTgzOjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxODk6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxODk6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAoKTsKQEAgLTQwNzM0LDE0ICs0MDc4MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjE5MjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxOTg6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTk2OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMTk3OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMDI6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMDM6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzkzKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wX19JbXBsKCk7CkBAIC00MDc3MiwyMyArNDA4MTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMDQ6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxMDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjA4OjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIwOToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxNDoxOiAoICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMTU6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMDk6MTogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMTA6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxNToxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxNjoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMTE6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxMTozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMTc6MjogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxNzozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAoKTsKQEAgLTQwODIzLDE0ICs0MDg2OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIxOToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMSA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMjU6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjIzOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjI0OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMjk6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMzA6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wXzBfXzFfX0ltcGwoKTsKQEAgLTQwODU2LDIyICs0MDkwMiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIzMDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCA6ICggJzonICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIzNjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMV9fSW1wbCA6ICggJzonICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIzNDoxOiAoICggJzonICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjM1OjE6ICggJzonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI0MDoxOiAoICggJzonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjQxOjE6ICggJzonICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjIzNToxOiAoICc6JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyMzY6MjogJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyNDE6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjQyOjI6ICc6JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbG9uS2V5d29yZF8yXzFfMF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzJfMV8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC00MDg5NywxNCArNDA5NDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyNDY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjUyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI1MDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI1MToyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMF9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjU2OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzBfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjU3OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Myk7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMF9fSW1wbCgpOwpAQCAtNDA5MzUsMjIgKzQwOTgxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjU4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIDogKCAnZGVmYXVsdCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjY0OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wX19JbXBsIDogKCAnZGVmYXVsdCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjYyOjE6ICggKCAnZGVmYXVsdCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyNjM6MTogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjY4OjE6ICggKCAnZGVmYXVsdCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyNjk6MTogKCAnZGVmYXVsdCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjYzOjE6ICggJ2RlZmF1bHQnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI2NDoyOiAnZGVmYXVsdCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI2OToxOiAoICdkZWZhdWx0JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyNzA6MjogJ2RlZmF1bHQnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEtleXdvcmRfNV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDczLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRLZXl3b3JkXzVfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC00MDk3NiwxNCArNDEwMjIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyNzM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzEgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjc5OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xIDogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI3NzoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI3ODoyOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMV9fSW1wbCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjgzOjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjg0OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMV9fSW1wbCgpOwpAQCAtNDEwMTQsMjIgKzQxMDYwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjg1OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsIDogKCAnOicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjkxOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18xX19JbXBsIDogKCAnOicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjg5OjE6ICggKCAnOicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyOTA6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjk1OjE6ICggKCAnOicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyOTY6MTogKCAnOicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMjkwOjE6ICggJzonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI5MToyOiAnOicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjI5NjoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIyOTc6MjogJzonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzVfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfNV8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQxMDU1LDE0ICs0MTEwMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMwMDoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMiA6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzMDY6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIgOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzA0OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzA1OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzMTA6MTogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzMTE6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzJfX0ltcGwoKTsKQEAgLTQxMDg4LDIzICs0MTEzNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMxMToxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCA6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzE3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18yX19JbXBsIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfNV9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzMTU6MTogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzE2OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzIxOjE6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMyMjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMxNjoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMxNzoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzIyOjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzIzOjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEFzc2lnbm1lbnRfNV8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMxODoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzE4OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMyNDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzI0OjM6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlZmF1bHRBc3NpZ25tZW50XzVfMigpOwpAQCAtNDExMzksMTQgKzQxMTg1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzMjc6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzMzOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzMxOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMzMjoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMzNzoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzMzg6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185NCk7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsKCk7CkBAIC00MTE3NywyMyArNDEyMjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjMzOToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNDU6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNDM6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzQ0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzQ5OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM1MDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM0NDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM0NToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzUwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzUxOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFhDYXNlUGFydEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM0NjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzQ2OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzUyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNTI6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQxMjE4LDE0ICs0MTI2NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzU0OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzEgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM2MDoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM1ODoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNTk6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNjQ6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzY1OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTQpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNDEyNTYsMzEgKzQxMzAyLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNjY6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNzI6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM3MDoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM3MToxOiAoICggcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzc2OjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzc3OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNzE6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM3MjoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNzc6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM3ODoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFR5cGVHdWFyZEFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNzM6MjogKCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzc5OjI6ICggcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEgKT8KICAgICAgICAgICAgIGludCBhbHQxMDM9MjsKICAgICAgICAgICAgIGludCBMQTEwM18wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKExBMTAzXzA9PVJVTEVfSUR8fExBMTAzXzA9PTMxfHxMQTEwM18wPT03OCkgKSB7CisgICAgICAgICAgICBpZiAoIChMQTEwM18wPT1SVUxFX0lEfHxMQTEwM18wPT0zMXx8TEExMDNfMD09NzkpICkgewogICAgICAgICAgICAgICAgIGFsdDEwMz0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMDMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzNzM6MzogcnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzc5OjM6IHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xKCk7CkBAIC00MTMxOCwxNCArNDEzNjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM4MToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzODc6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMiA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzODU6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzg2OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzkxOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM5MjoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk0KTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTQxMzU2LDMxICs0MTQwMiwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzkzOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM5OToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjM5NzoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIzOTg6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MDM6MTogKCAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDA0OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzk4OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyMzk5OjI6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MDQ6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MDU6MjogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MDA6MjogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQwNjoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCApPwogICAgICAgICAgICAgaW50IGFsdDEwND0yOwogICAgICAgICAgICAgaW50IExBMTA0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMDRfMD09OTApICkgeworICAgICAgICAgICAgaWYgKCAoTEExMDRfMD09OTEpICkgewogICAgICAgICAgICAgICAgIGFsdDEwND0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMDQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MDA6MzogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQwNjozOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wKCk7CkBAIC00MTQxOCwxNCArNDE0NjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQwODoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDE0OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzMgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQxMjoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDEzOjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQxODoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDE5OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbCgpOwpAQCAtNDE0NTEsMjMgKzQxNDk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MTk6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDI1OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDIzOjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQyNDoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQyOToxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MzA6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MjQ6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MjU6MjogKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQzMDoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQzMToyOiAoIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MjY6MjogKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQyNjozOiBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MzI6MjogKCBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQzMjozOiBydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMoKTsKQEAgLTQxNTAyLDE0ICs0MTU0OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0MzU6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDQxOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0Mzk6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ0MDoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0NDU6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ0NjoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzBfX0ltcGwoKTsKQEAgLTQxNTQwLDIyICs0MTU4NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0NDc6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wX19JbXBsIDogKCAnY2FzZScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDUzOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCA6ICggJ2Nhc2UnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0NTE6MTogKCAoICdjYXNlJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ1MjoxOiAoICdjYXNlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0NTc6MTogKCAoICdjYXNlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ1ODoxOiAoICdjYXNlJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0NTI6MTogKCAnY2FzZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDUzOjI6ICdjYXNlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDU4OjE6ICggJ2Nhc2UnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ1OToyOiAnY2FzZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZUtleXdvcmRfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDkwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDkxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRDYXNlS2V5d29yZF8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDE1ODEsMTQgKzQxNjI3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ2MjoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzEgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ2ODoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzEgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0NjY6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDY3OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDcyOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ3MzoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18xX19JbXBsKCk7CkBAIC00MTYxNCwyMyArNDE2NjAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDczOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMV9fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ3OToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzJfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDc3OjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0Nzg6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDgzOjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0ODQ6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDc4OjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ3OToyOiAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ4NDoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0ODU6MjogKCBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENhc2VBc3NpZ25tZW50XzJfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0ODA6MjogKCBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0ODA6MzogcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ4NjoyOiAoIHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ4NjozOiBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSgpOwpAQCAtNDE2NjUsMTQgKzQxNzExLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNDg5OjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ5NToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCA6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0OTM6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI0OTQ6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjQ5OToxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUwMDoyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzBfX0ltcGwoKTsKQEAgLTQxNzAzLDIyICs0MTc0OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUwMToxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMF9fSW1wbCA6ICggJzonICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUwNzoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMF9fSW1wbCA6ICggJzonICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUwNToxOiAoICggJzonICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTA2OjE6ICggJzonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUxMToxOiAoICggJzonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTEyOjE6ICggJzonICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUwNjoxOiAoICc6JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1MDc6MjogJzonCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1MTI6MTogKCAnOicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTEzOjI6ICc6JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENvbG9uS2V5d29yZF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC00MTc0NCwxNCArNDE3OTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1MTY6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzEgOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTIyOjE6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xIDogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUyMDoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUyMToyOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTI2OjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTI3OjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18xX19JbXBsKCk7CkBAIC00MTc3NywyMyArNDE4MjMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1Mjc6MTogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUzMzoxOiBydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTMxOjE6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUzMjoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUzNzoxOiAoICggKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1Mzg6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1MzI6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1MzM6MjogKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUzODoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUzOToyOiAoIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF8zXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1MzQ6MjogKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjUzNDozOiBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NDA6MjogKCBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU0MDozOiBydWxlX19YQ2FzZVBhcnRfX1RoZW5Bc3NpZ25tZW50XzNfMF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEoKTsKQEAgLTQxODI4LDE0ICs0MTg3NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTQzOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU0OToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU0NzoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NDg6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NTM6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTU0OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNDE4NjYsMjMgKzQxOTEyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NTU6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NjE6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU1OToxOiAoICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU2MDoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTY1OjE6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTY2OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NjA6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU2MToyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NjY6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU2NzoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTYyOjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU2MjozOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU2ODoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1Njg6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCgpOwpAQCAtNDE5MTcsMTQgKzQxOTYzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1NzA6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTc2OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTc0OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU3NToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU4MDoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1ODE6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC00MTk1NSwyMyArNDIwMDEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU4MjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU4ODoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTg2OjE6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTg3OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1OTI6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1OTM6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU4NzoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTg4OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU5MzoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTk0OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI1ODk6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTg5OjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNTk1OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU5NTozOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xKCk7CkBAIC00MjAwNiwxNCArNDIwNTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjU5NzoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MDM6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MDE6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjAyOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjA3OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYwODoyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTQyMDQ0LDIyICs0MjA5MCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjA5OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MTU6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjEzOjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MTQ6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjE5OjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MjA6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjE0OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYxNToyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYyMDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MjE6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDIwODUsMTQgKzQyMTMxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MjQ6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYzMDoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2Mjg6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYyOToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2MzQ6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYzNToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTQyMTE4LDIzICs0MjE2NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjM1OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY0MToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjYzOToxOiAoICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NDA6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NDU6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjQ2OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjQwOjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjQxOjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NDY6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NDc6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjQyOjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NDI6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjQ4OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NDg6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zKCk7CkBAIC00MjE2OSwxNCArNDIyMTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjUxOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjU3OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY1NToxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NTY6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NjE6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjYyOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwoKTsKQEAgLTQyMjAyLDIzICs0MjI0OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NjI6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjY4OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NjY6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY2NzoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2NzI6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY3MzoxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2Njc6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjY4OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjczOjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY3NDoyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY2OToyOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY2OTozOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjc1OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjc1OjM6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wKCk7CkBAIC00MjI1MywxNCArNDIyOTksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2Nzg6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjg0OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY4MjoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY4MzoyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjg4OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjg5OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185NSk7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCgpOwpAQCAtNDIyOTEsMjMgKzQyMzM3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjkwOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2OTY6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY5NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI2OTU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MDA6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzAxOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjk1OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjk2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MDE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MDI6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWN0aW9uXzBfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjY5NzoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNjk3OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzAzOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MDM6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQyMzMyLDE0ICs0MjM3OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjcwNToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMSA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MTE6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzA5OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzEwOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MTU6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MTY6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM3KTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsKCk7CkBAIC00MjM3MCwyMiArNDI0MTYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MTc6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICdmb3InICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjcyMzoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzIxOjE6ICggKCAnZm9yJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjcyMjoxOiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjcyNzoxOiAoICggJ2ZvcicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3Mjg6MTogKCAnZm9yJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MjI6MTogKCAnZm9yJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3MjM6MjogJ2ZvcicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjcyODoxOiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjcyOToyOiAnZm9yJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDkxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDkyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQyNDExLDE0ICs0MjQ1NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjczMjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiA6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3Mzg6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzM2OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzM3OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NDI6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NDM6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsKCk7CkBAIC00MjQ0OSwyMiArNDI0OTUsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NDQ6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgOiAoICcoJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NTA6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgOiAoICcoJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NDg6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc0OToxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NTQ6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc1NToxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NDk6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzUwOjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzU1OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc1NjoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC00MjQ5MCwxNCArNDI1MzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NTk6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzMgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fM19fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzY1OjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zIDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc2MzoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc2NDoyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fM19fSW1wbCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzY5OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzcwOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zX19JbXBsIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Myk7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fM19fSW1wbCgpOwpAQCAtNDI1MjgsMjMgKzQyNTc0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzcxOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zX19JbXBsIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3Nzc6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc3NToxOiAoICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3NzY6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3ODE6MTogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzgyOjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzc2OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzc3OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3ODI6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3ODM6MjogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzc4OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3Nzg6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzg0OjI6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3ODQ6MzogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8wXzBfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zKCk7CkBAIC00MjU3OSwxNCArNDI2MjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3ODY6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzQgOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzkyOjE6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180IDogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc5MDoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjc5MToyOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzk2OjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyNzk3OjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX180X19JbXBsKCk7CkBAIC00MjYxMiwyMiArNDI2NTgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI3OTc6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwgOiAoICc6JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4MDM6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzRfX0ltcGwgOiAoICc6JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4MDE6MTogKCAoICc6JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgwMjoxOiAoICc6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4MDc6MTogKCAoICc6JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgwODoxOiAoICc6JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4MDI6MTogKCAnOicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODAzOjI6ICc6JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODA4OjE6ICggJzonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgwOToyOiAnOicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzBfMF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDg5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDkwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMF8wXzQoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDI2NTMsMTQgKzQyNjk5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgxMzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4MTk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgxNzoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODE4OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgyMzoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODI0OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzk1KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNDI2OTEsMjMgKzQyNzM3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgyNToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgzMToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4Mjk6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODMwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODM1OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgzNjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgzMDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgzMToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODM2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODM3OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4MzI6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgzMjozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjgzODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODM4OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC00MjczMiwxNCArNDI3NzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODQwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg0NjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODQ0OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NDU6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODUwOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NTE6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzcpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC00Mjc3MCwyMiArNDI4MTYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODUyOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODU4OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ2ZvcicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg1NjoxOiAoICggJ2ZvcicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NTc6MTogKCAnZm9yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NjI6MTogKCAoICdmb3InICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODYzOjE6ICggJ2ZvcicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODU3OjE6ICggJ2ZvcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODU4OjI6ICdmb3InCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NjM6MTogKCAnZm9yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NjQ6MjogJ2ZvcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQyODExLDE0ICs0Mjg1NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4Njc6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODczOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4NzE6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg3MjoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4Nzc6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg3ODoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKTsKQEAgLTQyODQ5LDIyICs0Mjg5NSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4Nzk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODg1OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4ODM6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg4NDoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4ODk6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg5MDoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4ODQ6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODg1OjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyODkwOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg5MToyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQyODkwLDE0ICs0MjkzNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4OTQ6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTAwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI4OTg6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjg5OToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MDQ6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkwNToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185Nik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTQyOTI4LDMxICs0Mjk3NCwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MDY6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkxMjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkxMDoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkxMToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTE2OjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTE3OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MTE6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkxMjoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MTc6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkxODoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MTM6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTE5OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQxMDU9MjsKICAgICAgICAgICAgIGludCBMQTEwNV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTEwNV8wPj1SVUxFX0lEICYmIExBMTA1XzA8PVJVTEVfU1RSSU5HKXx8TEExMDVfMD09Mjd8fChMQTEwNV8wPj0zNCAmJiBMQTEwNV8wPD0zNSl8fExBMTA1XzA9PTQwfHwoTEExMDVfMD49NDQgJiYgTEExMDVfMDw9NTApfHxMQTEwNV8wPT02MHx8TEExMDVfMD09Nzh8fChMQTEwNV8wPj04MiAmJiBMQTEwNV8wPD04Myl8fExBMTA1XzA9PTg2fHxMQTEwNV8wPT04OHx8KExBMTA1XzA+PTkxICYmIExBMTA1XzA8PTk5KXx8TEExMDVfMD09MTAxfHwoTEExMDVfMD49MTA5ICYmIExBMTA1XzA8PTExMCkpICkgeworICAgICAgICAgICAgaWYgKCAoKExBMTA1XzA+PVJVTEVfSUQgJiYgTEExMDVfMDw9UlVMRV9TVFJJTkcpfHxMQTEwNV8wPT0yN3x8KExBMTA1XzA+PTM0ICYmIExBMTA1XzA8PTM1KXx8TEExMDVfMD09NDB8fChMQTEwNV8wPj00NCAmJiBMQTEwNV8wPD01MCl8fExBMTA1XzA9PTYxfHxMQTEwNV8wPT03OXx8KExBMTA1XzA+PTgzICYmIExBMTA1XzA8PTg0KXx8TEExMDVfMD09ODd8fExBMTA1XzA9PTg5fHwoTEExMDVfMD49OTIgJiYgTEExMDVfMDw9MTAwKXx8TEExMDVfMD09MTAyfHwoTEExMDVfMD49MTEwICYmIExBMTA1XzA8PTExMSkpICkgewogICAgICAgICAgICAgICAgIGFsdDEwNT0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMDUpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MTM6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTE5OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wKCk7CkBAIC00Mjk5MCwxNCArNDMwMzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTIxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkyNzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTI1OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MjY6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTMxOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5MzI6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsKCk7CkBAIC00MzAyOCwyMiArNDMwNzQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTMzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJzsnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkzOToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgOiAoICc7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTM3OjE6ICggKCAnOycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5Mzg6MTogKCAnOycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTQzOjE6ICggKCAnOycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NDQ6MTogKCAnOycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTM4OjE6ICggJzsnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjkzOToyOiAnOycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk0NDoxOiAoICc7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NDU6MjogJzsnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc2LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC00MzA2OSwxNCArNDMxMTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTQ4OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzYgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk1NDoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTUyOjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NTM6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTU4OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NTk6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTcpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCk7CkBAIC00MzEwNywzMSArNDMxNTMsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTYwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NjY6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NjQ6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NjU6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk3MDoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk3MToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTY1OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NjY6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTcxOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5NzI6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTY3OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk3MzoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81ICk/CiAgICAgICAgICAgICBpbnQgYWx0MTA2PTI7CiAgICAgICAgICAgICBpbnQgTEExMDZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoICgoTEExMDZfMD49UlVMRV9JRCAmJiBMQTEwNl8wPD1SVUxFX1NUUklORyl8fExBMTA2XzA9PTI3fHwoTEExMDZfMD49MzQgJiYgTEExMDZfMDw9MzUpfHxMQTEwNl8wPT00MHx8KExBMTA2XzA+PTQ1ICYmIExBMTA2XzA8PTUwKXx8TEExMDZfMD09NjB8fExBMTA2XzA9PTc4fHwoTEExMDZfMD49ODIgJiYgTEExMDZfMDw9ODMpfHxMQTEwNl8wPT04Nnx8TEExMDZfMD09ODh8fChMQTEwNl8wPj05MSAmJiBMQTEwNl8wPD05OSl8fExBMTA2XzA9PTEwMXx8TEExMDZfMD09MTEwKSApIHsKKyAgICAgICAgICAgIGlmICggKChMQTEwNl8wPj1SVUxFX0lEICYmIExBMTA2XzA8PVJVTEVfU1RSSU5HKXx8TEExMDZfMD09Mjd8fChMQTEwNl8wPj0zNCAmJiBMQTEwNl8wPD0zNSl8fExBMTA2XzA9PTQwfHwoTEExMDZfMD49NDUgJiYgTEExMDZfMDw9NTApfHxMQTEwNl8wPT02MXx8TEExMDZfMD09Nzl8fChMQTEwNl8wPj04MyAmJiBMQTEwNl8wPD04NCl8fExBMTA2XzA9PTg3fHxMQTEwNl8wPT04OXx8KExBMTA2XzA+PTkyICYmIExBMTA2XzA8PTEwMCl8fExBMTA2XzA9PTEwMnx8TEExMDZfMD09MTExKSApIHsKICAgICAgICAgICAgICAgICBhbHQxMDY9MTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTY3OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk3MzozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSgpOwpAQCAtNDMxNjksMTQgKzQzMjE1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk3NToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzYgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5ODE6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk3OToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTgwOjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk4NToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTg2OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM4KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCgpOwpAQCAtNDMyMDcsMjIgKzQzMjUzLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk4NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICc7JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5OTM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAnOycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk5MToxOiAoICggJzsnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTkyOjE6ICggJzsnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk5NzoxOiAoICggJzsnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTk4OjE6ICggJzsnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjk5MjoxOiAoICc7JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5OTM6MjogJzsnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTI5OTg6MTogKCAnOycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEyOTk5OjI6ICc7JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfNigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzYoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDMyNDgsMTQgKzQzMjk0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAwMjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzcgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzdfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMDg6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAwNjoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzggKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDA3OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzgKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAxMjoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzggKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDEzOjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzgKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM4KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCgpOwpAQCAtNDMyODYsMzEgKzQzMzMyLDMxIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX183X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAxNDoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzdfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDIwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fN19fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzdfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDE4OjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDE5OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMjQ6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMjU6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAxOToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDIwOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAyNToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDI2OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAyMToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMjc6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCApPwogICAgICAgICAgICAgaW50IGFsdDEwNz0yOwogICAgICAgICAgICAgaW50IExBMTA3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBMTA3XzA+PVJVTEVfSUQgJiYgTEExMDdfMDw9UlVMRV9TVFJJTkcpfHxMQTEwN18wPT0yN3x8KExBMTA3XzA+PTM0ICYmIExBMTA3XzA8PTM1KXx8TEExMDdfMD09NDB8fChMQTEwN18wPj00NSAmJiBMQTEwN18wPD01MCl8fExBMTA3XzA9PTYwfHxMQTEwN18wPT03OHx8KExBMTA3XzA+PTgyICYmIExBMTA3XzA8PTgzKXx8TEExMDdfMD09ODZ8fExBMTA3XzA9PTg4fHwoTEExMDdfMD49OTEgJiYgTEExMDdfMDw9OTkpfHxMQTEwN18wPT0xMDF8fExBMTA3XzA9PTExMCkgKSB7CisgICAgICAgICAgICBpZiAoICgoTEExMDdfMD49UlVMRV9JRCAmJiBMQTEwN18wPD1SVUxFX1NUUklORyl8fExBMTA3XzA9PTI3fHwoTEExMDdfMD49MzQgJiYgTEExMDdfMDw9MzUpfHxMQTEwN18wPT00MHx8KExBMTA3XzA+PTQ1ICYmIExBMTA3XzA8PTUwKXx8TEExMDdfMD09NjF8fExBMTA3XzA9PTc5fHwoTEExMDdfMD49ODMgJiYgTEExMDdfMDw9ODQpfHxMQTEwN18wPT04N3x8TEExMDdfMD09ODl8fChMQTEwN18wPj05MiAmJiBMQTEwN18wPD0xMDApfHxMQTEwN18wPT0xMDJ8fExBMTA3XzA9PTExMSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MTA3PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAyMTozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMjc6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAoKTsKQEAgLTQzMzQ4LDE0ICs0MzM5NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMjk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184IDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184X19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDM1OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMzM6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzAzNDoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwMzk6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA0MDoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzhfX0ltcGwoKTsKQEAgLTQzMzg2LDIyICs0MzQzMiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNDE6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX184X19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDQ3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNDU6MTogKCAoICcpJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA0NjoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNTE6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA1MjoxOiAoICcpJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNDY6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDQ3OjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDUyOjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA1MzoyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF84KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzgoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDM0MjcsMTQgKzQzNDczLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA1NjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzkgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA2MjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzkgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNjA6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDYxOjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDY2OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA2NzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsKCk7CkBAIC00MzQ2MCwyMyArNDM1MDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzlfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDY3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbCA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNzM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX185X19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fOV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNzE6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNzI6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA3NzoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA3ODoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDcyOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNzM6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDc4OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNzk6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF85KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA3NDoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwNzQ6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF85CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwODA6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDgwOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkoKTsKQEAgLTQzNTExLDE0ICs0MzU1NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA4MzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwODk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDg3OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMDg4OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwOTM6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwOTQ6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM5KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsKCk7CkBAIC00MzU0OSwyMyArNDM1OTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMwOTU6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzBfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTAxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzA5OToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEwMDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTA1OjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTA2OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMDA6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEwMToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMDY6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEwNzoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTAyOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEwMjozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEwODoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMDg6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCgpOwpAQCAtNDM2MDAsMTQgKzQzNjQ2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTEwOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzExNjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMTQ6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMTU6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEyMDoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEyMToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM19fMV9fSW1wbCgpOwpAQCAtNDM2MzMsMzUgKzQzNjc5LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTIxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTI3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTI1OjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMjY6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTMxOjE6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMzI6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTI2OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEyNzoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEzMjoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxMzM6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEyODoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzEzNDoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3AxMDg6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDEwOD0yOwogICAgICAgICAgICAgICAgIGludCBMQTEwOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEwOF8wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMDhfMD09ODEpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQxMDg9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA4KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTI4OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTM0OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV180MCk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAoKTsKQEAgLTQzNzAyLDE0ICs0Mzc0OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTM3OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE0MzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE0MToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNDI6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNDc6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTQ4OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTgpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpOwpAQCAtNDM3NDAsMjIgKzQzNzg2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNDk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE1NToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnLCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNTM6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE1NDoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNTk6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE2MDoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNTQ6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTU1OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTYwOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE2MToyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQzNzgxLDE0ICs0MzgyNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTY0OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNzA6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTY4OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNjk6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTc0OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxNzU6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC00MzgxNCwyMyArNDM4NjAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE3NToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTgxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE3OToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTgwOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE4NToxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTg2OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE4MDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxODE6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxODY6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTg3OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTgyOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTgyOjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxODg6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxODg6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKTsKQEAgLTQzODY1LDE0ICs0MzkxMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzE5MToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMxOTc6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTk1OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMTk2OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMDE6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMDI6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM5KTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18wX19JbXBsKCk7CkBAIC00MzkwMywyMyArNDM5NDksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMDM6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzBfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMDk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzBfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMDc6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIwODoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMTM6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIxNDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMDg6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjA5OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjE0OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIxNToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIxMDoyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIxMDozOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjE2OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjE2OjM6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wKCk7CkBAIC00Mzk1NCwxNCArNDQwMDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMTg6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzEgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjI0OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIyMjoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIyMzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjI4OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjI5OjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83X18xX19JbXBsKCk7CkBAIC00Mzk4NywzNSArNDQwMzMsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMjk6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMzU6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMzM6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzIzNDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMzk6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI0MDoxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMzQ6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjM1OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjQwOjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI0MToyOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjM2OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjQyOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCApKgogICAgICAgICAgICAgbG9vcDEwOToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTA5PTI7CiAgICAgICAgICAgICAgICAgaW50IExBMTA5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTA5XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwOV8wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDEwOT0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMDkpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyMzY6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNDI6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCgpOwpAQCAtNDQwNTYsMTQgKzQ0MTAyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNDU6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjUxOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAgOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjQ5OjE6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI1MDoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI1NToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNTY6MjogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMF9fSW1wbCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsKCk7CkBAIC00NDA5NCwyMiArNDQxNDAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI1NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjYzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI2MToxOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjYyOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI2NzoxOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjY4OjE6ICggJywnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI2MjoxOiAoICcsJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNjM6MjogJywnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNjg6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjY5OjI6ICcsJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF83XzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfN18xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDQxMzUsMTQgKzQ0MTgxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNzI6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSA6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI3ODoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xIDogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyNzY6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI3NzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyODI6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI4MzoyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwoKTsKQEAgLTQ0MTY4LDIzICs0NDIxNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjgzOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI4OToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN18xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzI4NzoxOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyODg6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyOTM6MTogKCAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjk0OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjg4OjE6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjg5OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyOTQ6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19VcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyOTU6MjogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjkwOjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyOTA6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMjk2OjI6ICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyOTY6MzogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xKCk7CkBAIC00NDIxOSwxNCArNDQyNjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMyOTk6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzA1OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMwMzoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMwNDoyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzA5OjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzEwOjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV185OSk7CiAgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNDQyNTcsMjMgKzQ0MzAzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzExOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMTc6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMxNToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMTY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMjE6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzIyOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzE2OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzE3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMjI6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMjM6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMTg6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMxODozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMyNDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzI0OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC00NDI5OCwxNCArNDQzNDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzMjY6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzMyOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMzMDoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzMzMToyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzM2OjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzM3OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNyk7CiAgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNDQzMzYsMjIgKzQ0MzgyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzM4OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnd2hpbGUnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM0NDoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3doaWxlJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNDI6MTogKCAoICd3aGlsZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNDM6MTogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM0ODoxOiAoICggJ3doaWxlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM0OToxOiAoICd3aGlsZScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzQzOjE6ICggJ3doaWxlJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNDQ6MjogJ3doaWxlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzQ5OjE6ICggJ3doaWxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNTA6MjogJ3doaWxlJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0V2hpbGVLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRXaGlsZUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC00NDM3NywxNCArNDQ0MjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNTM6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzU5OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM1NzoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM1ODoyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzYzOjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzY0OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNDQ0MTUsMjIgKzQ0NDYxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzY1OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzcxOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzY5OjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNzA6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzc1OjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNzY6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzcwOjE6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM3MToyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM3NjoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzNzc6MjogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDQ0NTYsMTQgKzQ0NTAyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzgwOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM4NjoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzODQ6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzODU6MjogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM5MDoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM5MToyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODYpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTQ0NDk0LDIzICs0NDU0MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM5MjoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzOTg6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzk2OjE6ICggKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzk3OjE6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MDI6MTogKCAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MDM6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzM5NzoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzk4OjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQwMzoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDA0OjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZUFzc2lnbm1lbnRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTMzOTk6MjogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzMzk5OjM6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDA1OjI6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQwNTozOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zKCk7CkBAIC00NDU0NSwxNCArNDQ1OTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MDc6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDEzOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQxMToxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQxMjoyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDE3OjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDE4OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtNDQ1ODMsMjIgKzQ0NjI5LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDE5OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDI1OjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDIzOjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MjQ6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDI5OjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MzA6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDI0OjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQyNToyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQzMDoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MzE6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsgCiAgICAgICAgICAgICB9CkBAIC00NDYyNCwxNCArNDQ2NzAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0MzQ6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDQwOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181IDogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQzODoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQzOToyOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDQ0OjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDQ1OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCk7CkBAIC00NDY1NywyMyArNDQ3MDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NDU6MTogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1MToxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDQ5OjE6ICggKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1MDoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1NToxOiAoICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NTY6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NTA6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NTE6MjogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1NjoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfNSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1NzoyOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keUFzc2lnbm1lbnRfNSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NTI6MjogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1MjozOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NTg6MjogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ1ODozOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUoKTsKQEAgLTQ0NzA4LDE0ICs0NDc1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDYxOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ2NzoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ2NToxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NjY6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0NzE6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDcyOjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTAwKTsKICAgICAgICAgICAgIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTQ0NzQ2LDIzICs0NDc5MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDczOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ3OToxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ3NzoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0Nzg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0ODM6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDg0OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDc4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDc5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0ODQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0ODU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDgwOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0ODA6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0ODY6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ4NjozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDQ3ODcsMTQgKzQ0ODMzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0ODg6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDk0OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNDkyOjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ5MzoyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzQ5ODoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM0OTk6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC00NDgyNSwyMiArNDQ4NzEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUwMDoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnZG8nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUwNjoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAnZG8nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTA0OjE6ICggKCAnZG8nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTA1OjE6ICggJ2RvJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1MTA6MTogKCAoICdkbycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1MTE6MTogKCAnZG8nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUwNToxOiAoICdkbycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTA2OjI6ICdkbycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUxMToxOiAoICdkbycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTEyOjI6ICdkbycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RG9LZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTQsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldERvS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ0ODY2LDE0ICs0NDkxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTE1OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUyMToxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUxOToxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1MjA6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1MjU6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTI2OjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfOTkpOwogICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNDQ5MDQsMjMgKzQ0OTUwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1Mjc6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1MzM6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUzMToxOiAoICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUzMjoxOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTM3OjE6ICggKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTM4OjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1MzI6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUzMzoyOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1Mzg6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUzOToyOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTM0OjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzUzNDozOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU0MDoyOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1NDA6MzogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMigpOwpAQCAtNDQ5NTUsMTQgKzQ1MDAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1NDI6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTQ4OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTQ2OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU0NzoyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU1MjoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1NTM6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNyk7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC00NDk5MywyMiArNDUwMzksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU1NDoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnd2hpbGUnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU2MDoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnd2hpbGUnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTU4OjE6ICggKCAnd2hpbGUnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTU5OjE6ICggJ3doaWxlJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1NjQ6MTogKCAoICd3aGlsZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1NjU6MTogKCAnd2hpbGUnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU1OToxOiAoICd3aGlsZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTYwOjI6ICd3aGlsZScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU2NToxOiAoICd3aGlsZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTY2OjI6ICd3aGlsZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0V2hpbGVLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFdoaWxlS2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ1MDM0LDE0ICs0NTA4MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTY5OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzQgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU3NToxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180IDogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU3MzoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1NzQ6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1Nzk6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTgwOjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpOwpAQCAtNDUwNzIsMjIgKzQ1MTE4LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1ODE6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU4NzoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX180X19JbXBsIDogKCAnKCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1ODU6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU4NjoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1OTE6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU5MjoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1ODY6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTg3OjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNTkyOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzU5MzoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzQoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDUxMTMsMTQgKzQ1MTU5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM1OTY6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNSA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjAyOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjAwOjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYwMToyOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYwNjoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2MDc6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNV9fSW1wbCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCk7CkBAIC00NTE1MSwyMyArNDUxOTcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYwODoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81ICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjE0OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzVfX0ltcGwgOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYxMjoxOiAoICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjEzOjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYxODoxOiAoICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjE5OjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYxMzoxOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2MTQ6MjogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2MTk6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjIwOjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVBc3NpZ25tZW50XzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjE1OjI6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjE1OjM6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2MjE6MjogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2MjE6MzogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzUoKTsKQEAgLTQ1MjAyLDE0ICs0NTI0OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjIzOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYgOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2Mjk6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNiA6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjI3OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2Mjg6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjMzOjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2MzQ6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fNl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCk7CkBAIC00NTIzNSwyMiArNDUyODEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYzNDoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjQwOjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzZfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX182X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYzODoxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjM5OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY0NDoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjQ1OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzYzOToxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NDA6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NDU6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjQ2OjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF82KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF82KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ1Mjc2LDE0ICs0NTMyMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY1MDoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NTY6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjU0OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjU1OjI6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NjA6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NjE6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgpOwogICAgICAgICAgICAgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTQ1MzE0LDIzICs0NTM2MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY2MjoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjY4OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NjY6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjY3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjcyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY3MzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY2NzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY2ODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjczOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjc0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjY5OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2Njk6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2NzU6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY3NTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDUzNTUsMTQgKzQ1NDAxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjc3OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY4MzoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2ODE6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2ODI6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY4NzoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY4ODoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTAxKTsKICAgICAgICAgICAgIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCk7CkBAIC00NTM5MywyMiArNDU0MzksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2ODk6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICd7JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2OTU6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICd7JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2OTM6MTogKCAoICd7JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzY5NDoxOiAoICd7JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2OTk6MTogKCAoICd7JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcwMDoxOiAoICd7JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM2OTQ6MTogKCAneycgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNjk1OjI6ICd7JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzAwOjE6ICggJ3snICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcwMToyOiAneycKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNjEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ1NDM0LDE0ICs0NTQ4MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcwNDoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MTA6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzA4OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzA5OjI6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MTQ6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MTU6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMSk7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNDU0NzIsMzUgKzQ1NTE4LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzE2OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzIyOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzIwOjE6ICggKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MjE6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzI2OjE6ICggKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3Mjc6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzIxOjE6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcyMjoyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcyNzoxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3Mjg6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcyMzoyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzcyOToyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgKSoKICAgICAgICAgICAgIGxvb3AxMTA6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDExMD0yOwogICAgICAgICAgICAgICAgIGludCBMQTExMF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoICgoTEExMTBfMD49UlVMRV9JRCAmJiBMQTExMF8wPD1SVUxFX1NUUklORyl8fExBMTEwXzA9PTI3fHwoTEExMTBfMD49MzQgJiYgTEExMTBfMDw9MzUpfHxMQTExMF8wPT00MHx8KExBMTEwXzA+PTQ0ICYmIExBMTEwXzA8PTUwKXx8TEExMTBfMD09NjB8fExBMTEwXzA9PTc4fHwoTEExMTBfMD49ODIgJiYgTEExMTBfMDw9ODMpfHxMQTExMF8wPT04Nnx8TEExMTBfMD09ODh8fChMQTExMF8wPj05MSAmJiBMQTExMF8wPD05OSl8fExBMTEwXzA9PTEwMXx8KExBMTEwXzA+PTEwOSAmJiBMQTExMF8wPD0xMTApKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExMTBfMD49UlVMRV9JRCAmJiBMQTExMF8wPD1SVUxFX1NUUklORyl8fExBMTEwXzA9PTI3fHwoTEExMTBfMD49MzQgJiYgTEExMTBfMDw9MzUpfHxMQTExMF8wPT00MHx8KExBMTEwXzA+PTQ0ICYmIExBMTEwXzA8PTUwKXx8TEExMTBfMD09NjF8fExBMTEwXzA9PTc5fHwoTEExMTBfMD49ODMgJiYgTEExMTBfMDw9ODQpfHxMQTExMF8wPT04N3x8TEExMTBfMD09ODl8fChMQTExMF8wPj05MiAmJiBMQTExMF8wPD0xMDApfHxMQTExMF8wPT0xMDJ8fChMQTExMF8wPj0xMTAgJiYgTEExMTBfMDw9MTExKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDExMD0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTApIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MjM6MzogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3Mjk6MzogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzg1KTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMCgpOwpAQCAtNDU1NDEsMTQgKzQ1NTg3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzMxOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zIDogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzczNzoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MzU6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3MzY6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc0MToxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc0MjoyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtNDU1NzQsMjIgKzQ1NjIwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzQyOjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnfScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzQ4OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAnfScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzQ2OjE6ICggKCAnfScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NDc6MTogKCAnfScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzUyOjE6ICggKCAnfScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NTM6MTogKCAnfScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzQ3OjE6ICggJ30nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc0ODoyOiAnfScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc1MzoxOiAoICd9JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NTQ6MjogJ30nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw2MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw2MixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ1NjE1LDE0ICs0NTY2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzU4OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc2NDoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wIDogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc2MjoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NjM6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3Njg6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wX19JbXBsIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzY5OjI6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMzMpOwogICAgICAgICAgICAgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCgpOwpAQCAtNDU2NTMsMjMgKzQ1Njk5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NzA6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMF9fSW1wbCA6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzc2OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwgOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzc0OjE6ICggKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc3NToxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc4MDoxOiAoICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3ODE6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NzU6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3NzY6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc4MToxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc4MjoyOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3Nzc6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc3NzozOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3ODM6MjogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc4MzozOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAoKTsKQEAgLTQ1NzA0LDE0ICs0NTc1MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzg1OjE6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEgOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3OTE6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMSA6IHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzg5OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3OTA6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzNzk1OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM3OTY6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsKCk7CkBAIC00NTczNywzMyArNDU3ODMsMzMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzc5NjoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18xX19JbXBsIDogKCAoICc7JyApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MDI6MTogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbCA6ICggKCAnOycgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MDA6MTogKCAoICggJzsnICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODAxOjE6ICggKCAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODA2OjE6ICggKCAoICc7JyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgwNzoxOiAoICggJzsnICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgwMToxOiAoICggJzsnICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgwMjoyOiAoICc7JyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODA3OjE6ICggKCAnOycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODA4OjI6ICggJzsnICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzJfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MDM6MjogKCAnOycgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgwOToyOiAoICc7JyApPwogICAgICAgICAgICAgaW50IGFsdDExMT0yOwogICAgICAgICAgICAgaW50IExBMTExXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMTFfMD09NzYpICkgeworICAgICAgICAgICAgaWYgKCAoTEExMTFfMD09NzcpICkgewogICAgICAgICAgICAgICAgIGFsdDExMT0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMTEpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MDM6MzogJzsnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgwOTozOiAnOycKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCw3NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDc3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDU3OTUsMTQgKzQ1ODQxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgxMjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MTg6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgxNjoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODE3OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgyMjoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODIzOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTQ1ODMzLDIzICs0NTg3OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MjQ6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MzA6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODI4OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgyOToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgzNDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MzU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4Mjk6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MzA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgzNToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgzNjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODMxOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4MzE6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4Mzc6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgzNzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNDU4NzQsMTQgKzQ1OTIwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzgzOToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzEgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4NDU6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg0MzoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODQ0OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg0OToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODUwOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNDU5MTIsMjMgKzQ1OTU4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg1MToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODU3OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODU1OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODU2OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4NjE6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4NjI6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg1NjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODU3OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg2MjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODYzOjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4NTg6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODU4OjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODY0OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg2NDozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xKCk7CkBAIC00NTk2MywxNCArNDYwMDksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODY2OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg3MjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODcwOjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4NzE6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODc2OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4Nzc6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDIpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC00NjAwMSwyMyArNDYwNDcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODc4OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4ODQ6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4ODI6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4ODM6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg4ODoxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg4OToxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODgzOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4ODQ6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODg5OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4OTA6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg4NToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4ODU6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4OTE6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODkxOjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzIoKTsKQEAgLTQ2MDUyLDE0ICs0NjA5OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4OTM6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM4OTk6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzODk3OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzg5ODoyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkwMzoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MDQ6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCgpOwpAQCAtNDYwODUsMjIgKzQ2MTMxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkwNDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTEwOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTA4OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTA5OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MTQ6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MTU6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkwOToxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTEwOjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkxNToxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTE2OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkxMToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MTc6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCApPwogICAgICAgICAgICAgaW50IGFsdDExMj0yOwogICAgICAgICAgICAgaW50IExBMTEyXzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtNDYxMDksNyArNDYxNTUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMTIpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MTE6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTE3OjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wKCk7CkBAIC00NjE0NywxNCArNDYxOTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkyMDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTI2OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzAgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkyNDoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTI1OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkzMDoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTMxOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCgpOwpAQCAtNDYxODAsMjMgKzQ2MjI2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MzE6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5Mzc6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkzNToxOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkzNjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTQxOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTQyOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5MzY6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkzNzoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NDI6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk0MzoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTM4OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzkzODozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk0NDoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NDQ6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCgpOwpAQCAtNDYyMzEsMTQgKzQ2Mjc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk0NzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NTM6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk1MToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTUyOjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk1NzoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTU4OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18wX19JbXBsKCk7CkBAIC00NjI2OSwyMyArNDYzMTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTU5OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk2NToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTYzOjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NjQ6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTY5OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NzA6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTY0OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk2NToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk3MDoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NzE6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMl8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NjY6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5NjY6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk3MjoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk3MjozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCgpOwpAQCAtNDYzMjAsMTQgKzQ2MzY2LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk3NDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk4MDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzEgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5Nzg6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTc5OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTg0OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk4NToyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF8wX18xX19JbXBsKCk7CkBAIC00NjM1MywyMyArNDYzOTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTg1OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk5MToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTg5OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5OTA6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTk1OjE6ICggKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5OTY6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEzOTkwOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk5MToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk5NjoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5OTc6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5OTI6MjogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTM5OTI6MzogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk5ODoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMzk5ODozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpOwpAQCAtNDY0MDQsMTQgKzQ2NDUwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDAxOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAwNzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCA6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwMDU6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwMDY6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAxMToxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAxMjoyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzBfX0ltcGwoKTsKQEAgLTQ2NDQyLDE3ICs0NjQ4OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAxMzoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggJz0nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAxOToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMF9fSW1wbCA6ICggJz0nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAxNzoxOiAoICggJz0nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDE4OjE6ICggJz0nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAyMzoxOiAoICggJz0nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDI0OjE6ICggJz0nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAxODoxOiAoICc9JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwMTk6MjogJz0nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwMjQ6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDI1OjI6ICc9JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzNfMCgpKTsgCkBAIC00NjQ4MywxNCArNDY1MjksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwMjg6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzEgOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDM0OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xIDogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAzMjoxOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDAzMzoyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDM4OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDM5OjI6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18xX19JbXBsKCk7CkBAIC00NjUxNiwyMyArNDY1NjIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwMzk6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNDU6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNDM6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA0NDoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNDk6MTogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA1MDoxOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNDQ6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDQ1OjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDUwOjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA1MToyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSaWdodEFzc2lnbm1lbnRfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA0NjoyOiAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA0NjozOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDUyOjI6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDUyOjM6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xKCk7CkBAIC00NjU2NywxNCArNDY2MTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA1NToxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIDogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNjE6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNTk6MTogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDYwOjI6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDY1OjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA2NjoyOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTQ2NjA1LDM4ICs0NjY1MSwzOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDY3OjE6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA3MzoxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA3MToxOiAoICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNzI6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNzc6MTogKCAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDc4OjE6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDcyOjE6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDczOjI6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNzg6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNzk6MjogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwNzQ6MjogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA4MDoyOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApPwogICAgICAgICAgICAgaW50IGFsdDExMz0yOwogICAgICAgICAgICAgaW50IExBMTEzXzAgPSBpbnB1dC5MQSgxKTsKIAogICAgICAgICAgICAgaWYgKCAoTEExMTNfMD09UlVMRV9JRCkgKSB7CiAgICAgICAgICAgICAgICAgaW50IExBMTEzXzEgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTEzXzE9PVJVTEVfSUR8fExBMTEzXzE9PTI3fHxMQTExM18xPT00M3x8TEExMTNfMT09ODMpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTEzXzE9PVJVTEVfSUR8fExBMTEzXzE9PTI3fHxMQTExM18xPT00M3x8TEExMTNfMT09ODQpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQxMTM9MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggKExBMTEzXzA9PTMxfHxMQTExM18wPT03OCkgKSB7CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTEzXzA9PTMxfHxMQTExM18wPT03OSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MTEzPTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA3NDozOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDgwOjM6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAoKTsKQEAgLTQ2Njc0LDE0ICs0NjcyMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDgyOjE6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwODg6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDg2OjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwODc6MjogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDkyOjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQwOTM6MjogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsKCk7CkBAIC00NjcwNywyMyArNDY3NTMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA5MzoxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA5OToxOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDk3OjE6ICggKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDk4OjE6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMDM6MTogKCAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMDQ6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDA5ODoxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MDk5OjI6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEwNDoxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTA1OjI6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMDA6MjogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTAwOjM6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTA2OjI6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEwNjozOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xKCk7CkBAIC00Njc1OCwxNCArNDY4MDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMDk6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTE1OjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIDogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDExMzoxOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDExNDoyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTE5OjE6ICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTIwOjI6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX19JbXBsKCk7CkBAIC00Njc5NiwyMyArNDY4NDIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMjE6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEyNzoxOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTI1OjE6ICggKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEyNjoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEzMToxOiAoICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMzI6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMjY6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMjc6MjogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEzMjoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEzMzoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMjg6MjogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEyODozOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxMzQ6MjogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEzNDozOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAoKTsKQEAgLTQ2ODQ3LDE0ICs0Njg5MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDEzNjoxOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMSA6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNDI6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEgOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTQwOjE6ICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTQxOjI6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNDY6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNDc6MjogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTQ2ODgwLDIzICs0NjkyNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE0NzoxOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTUzOjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNTE6MTogKCAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTUyOjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTU3OjE6ICggKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE1ODoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE1MjoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE1MzoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTU4OjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTU5OjI6ICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE1NDoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTU0OjM6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE2MDoyOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTYwOjM6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSgpOwpAQCAtNDY5MzEsMTQgKzQ2OTc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNjM6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTY5OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTY3OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE2ODoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE3MzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNzQ6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsKCk7CkBAIC00Njk2OSwyMyArNDcwMTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE3NToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxODE6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxNzk6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTgwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTg1OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE4NjoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE4MDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE4MToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTg2OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTg3OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhGZWF0dXJlQ2FsbEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE4MjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTgyOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTg4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxODg6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTQ3MDEwLDE0ICs0NzA1NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MTkwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE5NjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDE5NDoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQxOTU6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMDA6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjAxOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzYpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNDcwNDgsMjIgKzQ3MDk0LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMDI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjA4OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjA2OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIwNzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIxMjoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMTM6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMDc6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMDg6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIxMzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIxNDoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIwOToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjE1OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0MTE0PTI7CiAgICAgICAgICAgICBpbnQgTEExMTRfMCA9IGlucHV0LkxBKDEpOwogCkBAIC00NzA3Miw3ICs0NzExOCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExNCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIwOTozOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjE1OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAoKTsKQEAgLTQ3MTEwLDE0ICs0NzE1NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjE3OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzIgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIyMzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIyMToxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMjI6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMjc6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjI4OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzcpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNDcxNDgsMjMgKzQ3MTk0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMjk6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMzU6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIzMzoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIzNDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjM5OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjQwOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyMzQ6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIzNToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNDA6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI0MToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjM2OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDIzNjozOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI0MjoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNDI6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMigpOwpAQCAtNDcxOTksMTQgKzQ3MjQ1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNDQ6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMyA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjUwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjQ4OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fM19fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI0OToyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI1NDoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNTU6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fM19fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183Nyk7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsKCk7CkBAIC00NzIzNywyNyArNDcyODMsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI1NjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNjI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNjA6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjYxOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjY2OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI2NzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI2MToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI2MjoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjY3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjY4OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjYzOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNjk6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQxMTU9MjsKICAgICAgICAgICAgIGFsdDExNSA9IGRmYTExNS5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjYzOjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNjk6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCgpOwpAQCAtNDcyOTUsMTQgKzQ3MzQxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNzE6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI3NzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180IDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNzU6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI3NjoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyODE6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI4MjoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTQ3MzI4LDI3ICs0NzM3NCwyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjgyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyODg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mjg2OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyODc6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MjkyOjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyOTM6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mjg3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI4ODoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI5MzoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyOTQ6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI4OToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI5NToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgKT8KICAgICAgICAgICAgIGludCBhbHQxMTY9MjsKICAgICAgICAgICAgIGFsdDExNiA9IGRmYTExNi5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE2KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mjg5OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mjk1OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCgpOwpAQCAtNDczODYsMTQgKzQ3NDMyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI5ODoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzMDQ6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMwMjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzAzOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMwODoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzA5OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtNDc0MjQsMTcgKzQ3NDcwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMxMDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICc8JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzMTY6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsIDogKCAnPCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMxNDoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzE1OjE6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMyMDoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzIxOjE6ICggJzwnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMxNToxOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzMTY6MjogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzMjE6MTogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzIyOjI6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsgCkBAIC00NzQ2NSwxNCArNDc1MTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzI1OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDMzMToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzI5OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzMzA6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzM1OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzMzY6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzkpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC00NzUwMywyMyArNDc1NDksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzM3OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM0MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzQxOjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNDI6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzQ3OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNDg6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzQyOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM0MzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM0ODoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNDk6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNDQ6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNDQ6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM1MDoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM1MDozOiBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpOwpAQCAtNDc1NTQsMTQgKzQ3NjAwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM1MjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzIgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNTg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM1NjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzU3OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM2MjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzYzOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc5KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCgpOwpAQCAtNDc1OTIsMzUgKzQ3NjM4LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM2NDoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzJfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzcwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMl9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzY4OjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzY5OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNzQ6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNzU6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM2OToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzcwOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM3NToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mzc2OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM3MToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNzc6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCApKgogICAgICAgICAgICAgbG9vcDExNzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTE3PTI7CiAgICAgICAgICAgICAgICAgaW50IExBMTE3XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTE3XzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTExN18wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDExNz0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTcpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzNzE6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mzc3OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCgpOwpAQCAtNDc2NjEsMTQgKzQ3NzA3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM3OToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM4NToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzMgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzODM6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mzg0OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mzg5OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM5MDoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18zX19JbXBsKCk7CkBAIC00NzY5NCwxNyArNDc3NDAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0MzkwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fM19fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM5NjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwgOiAoICc+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mzk0OjE6ICggKCAnPicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQzOTU6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDAwOjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MDE6MTogKCAnPicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mzk1OjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDM5NjoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQwMToxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MDI6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV8zKCkpOyAKQEAgLTQ3NzM1LDE0ICs0Nzc4MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQwNjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMCA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MTI6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDEwOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDExOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MTY6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MTc6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wX19JbXBsKCk7CkBAIC00Nzc3MywyMiArNDc4MTksMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MTg6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MjQ6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MjI6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQyMzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0Mjg6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQyOToxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0MjM6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDI0OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDI5OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQzMDoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDc4MTQsMTQgKzQ3ODYwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDMzOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQzOToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0Mzc6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0Mzg6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQ0MzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQ0NDoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzFfMl9fMV9fSW1wbCgpOwpAQCAtNDc4NDcsMjMgKzQ3ODkzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDQ0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NTA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQ0ODoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NDk6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NTQ6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDU1OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDQ5OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDUwOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NTU6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NTY6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDUxOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NTE6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDU3OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NTc6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCk7CkBAIC00Nzg5OCwxNCArNDc5NDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDYwOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQ2NjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDY0OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NjU6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDcwOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0NzE6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODApOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsKCk7CkBAIC00NzkzNiwyMyArNDc5ODIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDcyOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDc4OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQ3NjoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0Nzc6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0ODI6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDgzOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDc3OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDc4OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0ODM6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0ODQ6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDc5OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0Nzk6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDg1OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0ODU6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wKCk7CkBAIC00Nzk4NywxNCArNDgwMzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDg3OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMSA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDQ5MzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDkxOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0OTI6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDk3OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ0OTg6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfODApOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsKCk7CkBAIC00ODAyNSwzMSArNDgwNzEsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NDk5OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTA1OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUwMzoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MDQ6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MDk6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTEwOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTA0OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTA1OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MTA6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MTE6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MDY6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUxMjoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSApPwogICAgICAgICAgICAgaW50IGFsdDExOD0yOwogICAgICAgICAgICAgaW50IExBMTE4XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoKExBMTE4XzA+PVJVTEVfSUQgJiYgTEExMThfMDw9UlVMRV9TVFJJTkcpfHxMQTExOF8wPT0yN3x8TEExMThfMD09MzF8fChMQTExOF8wPj0zNCAmJiBMQTExOF8wPD0zNSl8fExBMTE4XzA9PTQwfHwoTEExMThfMD49NDUgJiYgTEExMThfMDw9NTApfHxMQTExOF8wPT02MHx8TEExMThfMD09Nzh8fChMQTExOF8wPj04MiAmJiBMQTExOF8wPD04Myl8fExBMTE4XzA9PTg2fHxMQTExOF8wPT04OHx8KExBMTE4XzA+PTkxICYmIExBMTE4XzA8PTk5KXx8TEExMThfMD09MTAxfHxMQTExOF8wPT0xMDh8fExBMTE4XzA9PTExMCkgKSB7CisgICAgICAgICAgICBpZiAoICgoTEExMThfMD49UlVMRV9JRCAmJiBMQTExOF8wPD1SVUxFX1NUUklORyl8fExBMTE4XzA9PTI3fHxMQTExOF8wPT0zMXx8KExBMTE4XzA+PTM0ICYmIExBMTE4XzA8PTM1KXx8TEExMThfMD09NDB8fChMQTExOF8wPj00NSAmJiBMQTExOF8wPD01MCl8fExBMTE4XzA9PTYxfHxMQTExOF8wPT03OXx8KExBMTE4XzA+PTgzICYmIExBMTE4XzA8PTg0KXx8TEExMThfMD09ODd8fExBMTE4XzA9PTg5fHwoTEExMThfMD49OTIgJiYgTEExMThfMDw9MTAwKXx8TEExMThfMD09MTAyfHxMQTExOF8wPT0xMDl8fExBMTE4XzA9PTExMSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MTE4PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExOCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUwNjozOiBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTEyOjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEoKTsKQEAgLTQ4MDg3LDE0ICs0ODEzMywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MTQ6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MjA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTE4OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUxOToyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUyNDoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MjU6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCgpOwpAQCAtNDgxMjAsMjIgKzQ4MTY2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUyNToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MzE6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUyOToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTMwOjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUzNToxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTM2OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDUzMDoxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MzE6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1MzY6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTM3OjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC00ODE2MSwxNCArNDgyMDcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU0MToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NDc6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NDU6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTQ2OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTUxOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU1MjoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM5KTsKICAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwoKTsKQEAgLTQ4MTk5LDIzICs0ODI0NSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTUzOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU1OToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU1NzoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NTg6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NjM6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTY0OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTU4OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTU5OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NjQ6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NjU6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTYwOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NjA6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTY2OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1NjY6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wKCk7CkBAIC00ODI1MCwxNCArNDgyOTYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU2ODoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xIDogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTc0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU3MjoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTczOjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU3ODoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTc5OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCgpOwpAQCAtNDgyODMsMzUgKzQ4MzI5LDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1Nzk6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTg1OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTgzOjE6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU4NDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU4OToxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1OTA6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1ODQ6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ1ODU6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU5MDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU5MToyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU4NjoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTkyOjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wICkqCiAgICAgICAgICAgICBsb29wMTE5OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMTk9MjsKICAgICAgICAgICAgICAgICBpbnQgTEExMTlfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMTlfMD09ODApICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTE5XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0MTE5PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExOSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDU4NjozOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTkyOjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wKCk7CkBAIC00ODM1MiwxNCArNDgzOTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTk1OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCA6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMF9fSW1wbCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYwMToxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NTk5OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2MDA6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjA1OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2MDY6MjogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18wX19JbXBsKCk7CkBAIC00ODM5MCwyMiArNDg0MzYsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjA3OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYxMzoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjExOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2MTI6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjE3OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2MTg6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjEyOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYxMzoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYxODoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2MTk6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODEsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNDg0MzEsMTQgKzQ4NDc3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYyMjoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYyODoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzEgOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2MjY6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjI3OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjMyOjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDYzMzoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsKCk7CkBAIC00ODQ2NCwyMyArNDg1MTAsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjMzOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2Mzk6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2Mzc6MTogKCAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2Mzg6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY0MzoxOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY0NDoxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjM4OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2Mzk6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjQ0OjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NDU6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY0MDoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NDA6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NDY6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjQ2OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8xXzEoKTsKQEAgLTQ4NTE1LDE0ICs0ODU2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY0OToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NTU6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjUzOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjU0OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NTk6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NjA6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwMyk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNDg1NTMsMjMgKzQ4NTk5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjYxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2Njc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY2NToxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NjY6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NzE6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjcyOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjY2OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjY3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NzI6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NzM6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2Njg6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY2ODozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY3NDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Njc0OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC00ODU5NCwxNCArNDg2NDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2NzY6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjgyOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY4MDoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY4MToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Njg2OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Njg3OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183KTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC00ODYzMiwyMiArNDg2NzgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2ODg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwgOiAoICduZXcnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY5NDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMV9fSW1wbCA6ICggJ25ldycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NjkyOjE6ICggKCAnbmV3JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY5MzoxOiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY5ODoxOiAoICggJ25ldycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2OTk6MTogKCAnbmV3JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2OTM6MTogKCAnbmV3JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ2OTQ6MjogJ25ldycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDY5OToxOiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDcwMDoyOiAnbmV3JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0TmV3S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDk0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDk1LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0TmV3S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTQ4NjczLDE0ICs0ODcxOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDcwMzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMiA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MDk6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzA3OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzA4OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MTM6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MTQ6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNCk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNDg3MTEsMjMgKzQ4NzU3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzE1OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzIxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzE5OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MjA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzI1OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MjY6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzIwOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDcyMToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDcyNjoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3Mjc6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MjI6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MjI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDcyODoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDcyODozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Db25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpOwpAQCAtNDg3NjIsMTQgKzQ4ODA4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzMwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDczNjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMyA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180IDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MzQ6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3MzU6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc0MDoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc0MToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA0KTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18zX19JbXBsKCk7CkBAIC00ODgwMCwyNyArNDg4NDYsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NDI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NDg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzNfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NDY6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc0NzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NTI6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc1MzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NDc6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzQ4OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzUzOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc1NDoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzQ5OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzU1OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPwogICAgICAgICAgICAgaW50IGFsdDEyMD0yOwogICAgICAgICAgICAgYWx0MTIwID0gZGZhMTIwLnByZWRpY3QoaW5wdXQpOwogICAgICAgICAgICAgc3dpdGNoIChhbHQxMjApIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NDk6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NTU6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wKCk7CkBAIC00ODg1OCwxNCArNDg5MDQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NTc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzQgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzYzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180IDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc2MToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc2MjoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzY3OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzY4OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDQpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTQ4ODk2LDI3ICs0ODk0MiwyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc2OToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc3NToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNF9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc3MzoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Nzc0OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc3OToxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzgwOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc3NDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NzU6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3ODA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzgxOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NzY6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3ODI6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICk/CiAgICAgICAgICAgICBpbnQgYWx0MTIxPTI7CiAgICAgICAgICAgICBhbHQxMjEgPSBkZmExMjEucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc3NjozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc4MjozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAoKTsKQEAgLTQ4OTU0LDE0ICs0OTAwMCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc4NDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3OTA6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Nzg4OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzVfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Nzg5OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3OTQ6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3OTU6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzVfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzVfX0ltcGwoKTsKQEAgLTQ4OTg3LDI3ICs0OTAzMywyNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc5NToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODAxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX181X19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fNV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3OTk6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODAwOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODA1OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgwNjoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgwMDoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgwMToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODA2OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODA3OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzUoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODAyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MDg6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8KICAgICAgICAgICAgIGludCBhbHQxMjI9MjsKICAgICAgICAgICAgIGFsdDEyMiA9IGRmYTEyMi5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODAyOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MDg6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSgpOwpAQCAtNDkwNDUsMTQgKzQ5MDkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MTE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODE3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODE1OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgxNjoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgyMToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MjI6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsKCk7CkBAIC00OTA4MywyMyArNDkxMjksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgyMzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIDogKCAoICc8JyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgyOToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wX19JbXBsIDogKCAoICc8JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODI3OjE6ICggKCAoICc8JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODI4OjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MzM6MTogKCAoICggJzwnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MzQ6MTogKCAoICc8JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgyODoxOiAoICggJzwnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODI5OjI6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgzNDoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODM1OjI6ICggJzwnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfM18wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgzMDoyOiAoICc8JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MzA6MzogJzwnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4MzY6MjogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODM2OjM6ICc8JwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC00OTEzMCwxNCArNDkxNzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDgzODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NDQ6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NDI6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODQzOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODQ4OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg0OToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc5KTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwoKTsKQEAgLTQ5MTY4LDIzICs0OTIxNCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODUwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODU2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzFfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NTQ6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NTU6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg2MDoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg2MToxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODU1OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NTY6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODYxOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NjI6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg1NzoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NTc6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NjM6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODYzOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEoKTsKQEAgLTQ5MjE5LDE0ICs0OTI2NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODY1OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzIgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg3MToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg2OToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NzA6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4NzU6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18yX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODc2OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzJfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzkpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCgpOwpAQCAtNDkyNTcsMzUgKzQ5MzAzLDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4Nzc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMl9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODgzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzJfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODgxOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg4MjoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg4NzoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4ODg6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4ODI6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ4ODM6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg4ODoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg4OToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg4NDoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODkwOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wICkqCiAgICAgICAgICAgICBsb29wMTIzOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMjM9MjsKICAgICAgICAgICAgICAgICBpbnQgTEExMjNfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMjNfMD09ODApICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTIzXzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0MTIzPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg4NDozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODkwOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wKCk7CkBAIC00OTMyNiwxNCArNDkzNzIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg5MjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODk4OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzMgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDg5NjoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODk3OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkwMjoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTAzOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCgpOwpAQCAtNDkzNTksMTcgKzQ5NDA1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MDM6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkwOToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18zX19JbXBsIDogKCAnPicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MDc6MTogKCAoICc+JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkwODoxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MTM6MTogKCAoICc+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkxNDoxOiAoICc+JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MDg6MTogKCAnPicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTA5OjI6ICc+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTE0OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkxNToyOiAnPicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfM18zKCkpOyAKQEAgLTQ5NDAwLDE0ICs0OTQ0NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MTk6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTI1OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MjM6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkyNDoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5Mjk6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkzMDoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV183OCk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzBfX0ltcGwoKTsKQEAgLTQ5NDM4LDIyICs0OTQ4NCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MzE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18wX19JbXBsIDogKCAnLCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTM3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MzU6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDkzNjoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5NDE6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk0MjoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5MzY6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTM3OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTQyOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk0MzoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC00OTQ3OSwxNCArNDk1MjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTQ2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTUyOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk1MDoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5NTE6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5NTY6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTU3OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzFfX0ltcGwoKTsKQEAgLTQ5NTEyLDIzICs0OTU1OCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5NTc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM18yX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTYzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5NjE6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk2MjoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5Njc6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk2ODoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5NjI6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTYzOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTY4OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk2OToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk2NDoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk2NDozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTcwOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTcwOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xKCk7CkBAIC00OTU2MywxNCArNDk2MDksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk3MzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5Nzk6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5Nzc6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTc4OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTgzOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk4NDoyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwoKTsKQEAgLTQ5NjAxLDIzICs0OTY0NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTg1OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzBfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk5MToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDk4OToxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5OTA6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5OTU6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTk2OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTkwOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTkxOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5OTY6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5OTc6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTkyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5OTI6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0OTk4OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ5OTg6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wKCk7CkBAIC00OTY1MiwxNCArNDk2OTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAwMDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMDY6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMDQ6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDA1OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDEwOjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAxMToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18xX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzgwKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwoKTsKQEAgLTQ5NjkwLDMxICs0OTczNiwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDEyOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMTg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDE2OjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMTc6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDIyOjE6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMjM6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDE3OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAxODoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAyMzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMjQ6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfNF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAxOToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAyNToyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEgKT8KICAgICAgICAgICAgIGludCBhbHQxMjQ9MjsKICAgICAgICAgICAgIGludCBMQTEyNF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgIGlmICggKChMQTEyNF8wPj1SVUxFX0lEICYmIExBMTI0XzA8PVJVTEVfU1RSSU5HKXx8TEExMjRfMD09Mjd8fExBMTI0XzA9PTMxfHwoTEExMjRfMD49MzQgJiYgTEExMjRfMDw9MzUpfHxMQTEyNF8wPT00MHx8KExBMTI0XzA+PTQ1ICYmIExBMTI0XzA8PTUwKXx8TEExMjRfMD09NjB8fExBMTI0XzA9PTc4fHwoTEExMjRfMD49ODIgJiYgTEExMjRfMDw9ODMpfHxMQTEyNF8wPT04Nnx8TEExMjRfMD09ODh8fChMQTEyNF8wPj05MSAmJiBMQTEyNF8wPD05OSl8fExBMTI0XzA9PTEwMXx8TEExMjRfMD09MTA4fHxMQTEyNF8wPT0xMTApICkgeworICAgICAgICAgICAgaWYgKCAoKExBMTI0XzA+PVJVTEVfSUQgJiYgTEExMjRfMDw9UlVMRV9TVFJJTkcpfHxMQTEyNF8wPT0yN3x8TEExMjRfMD09MzF8fChMQTEyNF8wPj0zNCAmJiBMQTEyNF8wPD0zNSl8fExBMTI0XzA9PTQwfHwoTEExMjRfMD49NDUgJiYgTEExMjRfMDw9NTApfHxMQTEyNF8wPT02MXx8TEExMjRfMD09Nzl8fChMQTEyNF8wPj04MyAmJiBMQTEyNF8wPD04NCl8fExBMTI0XzA9PTg3fHxMQTEyNF8wPT04OXx8KExBMTI0XzA+PTkyICYmIExBMTI0XzA8PTEwMCl8fExBMTI0XzA9PTEwMnx8TEExMjRfMD09MTA5fHxMQTEyNF8wPT0xMTEpICkgewogICAgICAgICAgICAgICAgIGFsdDEyND0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMjQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMTk6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMjU6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xKCk7CkBAIC00OTc1MiwxNCArNDk3OTgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAyNzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDMzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzIgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAzMToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDMyOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTAzNzoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDM4OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCgpOwpAQCAtNDk3ODUsMjIgKzQ5ODMxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwMzg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCA6ICggJyknICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA0NDoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNDI6MTogKCAoICcpJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA0MzoxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNDg6MTogKCAoICcpJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA0OToxOiAoICcpJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNDM6MTogKCAnKScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDQ0OjI6ICcpJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDQ5OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA1MDoyOiAnKScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4MCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC00OTgyNiwxNCArNDk4NzIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNTQ6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzAgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDYwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA1ODoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA1OToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDY0OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDY1OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMF9fSW1wbCgpOwpAQCAtNDk4NjQsMjMgKzQ5OTEwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDY2OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA3MjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNzA6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNzE6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA3NjoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA3NzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDcxOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNzI6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDc3OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNzg6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA3MzoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNzM6MzogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwNzk6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDc5OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAoKTsKQEAgLTQ5OTE1LDE0ICs0OTk2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA4MToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMSA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwODc6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDg1OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDg2OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwOTE6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwOTI6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfXzFfX0ltcGwoKTsKQEAgLTQ5OTQ4LDM1ICs0OTk5NCwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA5MjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA5ODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA5NjoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MDk3OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEwMjoxOiAoICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTAzOjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA5NzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwOTg6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMDM6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTA0OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUwOTk6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMDU6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wICkqCiAgICAgICAgICAgICBsb29wMTI1OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMjU9MjsKICAgICAgICAgICAgICAgICBpbnQgTEExMjVfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMjVfMD09ODApICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTI1XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0MTI1PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNSkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTA5OTozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEwNTozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wKCk7CkBAIC01MDAxNywxNCArNTAwNjMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEwODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMTQ6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCA6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMTI6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTEzOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTE4OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMF9fSW1wbCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTExOToyOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wX19JbXBsIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwoKTsKQEAgLTUwMDU1LDIyICs1MDEwMSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTIwOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMjY6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTI0OjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMjU6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTMwOjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMzE6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTI1OjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEyNjoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEzMToxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxMzI6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfNF8xXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzRfMV8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MDA5NiwxNCArNTAxNDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEzNToxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xIDogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTQxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzEgOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTEzOToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTQwOjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE0NToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTQ2OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCgpOwpAQCAtNTAxMjksMjMgKzUwMTc1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNDY6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE1MjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNTA6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE1MToxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNTY6MTogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE1NzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNTE6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTUyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTU3OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE1ODoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE1MzoyOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE1MzozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTU5OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTU5OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xKCk7CkBAIC01MDE4MCwxNCArNTAyMjYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE2MjoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wIDogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNjg6MTogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNjY6MTogKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTY3OjI6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTcyOjE6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE3MzoyOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwNSk7CiAgICAgICAgICAgICBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsKCk7CkBAIC01MDIxOCwyMyArNTAyNjQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE3NDoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxODA6MTogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxNzg6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTc5OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTg0OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE4NToxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE3OToxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE4MDoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTg1OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTg2OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldFhCb29sZWFuTGl0ZXJhbEFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTE4MToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTgxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTg3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxODc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTUwMjU5LDE0ICs1MDMwNSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTg5OjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxOTU6MTogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTkzOjE6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUxOTQ6MjogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MTk5OjE6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMDA6MjogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01MDI5MiwyMyArNTAzMzgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIwMDoxOiBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMDY6MTogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMDQ6MTogKCAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjA1OjE6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjEwOjE6ICggKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIxMToxOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIwNToxOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIwNjoyOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjExOjE6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjEyOjI6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIwNzoyOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjA3OjM6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIxMzoyOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjEzOjM6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSgpOwpAQCAtNTAzNDMsMTQgKzUwMzg5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMTY6MTogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjIyOjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjIwOjE6ICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIyMToyOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIyNjoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMjc6MjogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMDYpOwogICAgICAgICAgICAgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTAzODEsMjMgKzUwNDI3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMjg6MTogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjM0OjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjMyOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIzMzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIzODoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMzk6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMzM6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMzQ6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIzOToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI0MDoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVsbExpdGVyYWxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyMzU6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTIzNTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI0MToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjQxOjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01MDQyMiwxNCArNTA0NjgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI0MzoxOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xIDogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjQ5OjE6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI0NzoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjQ4OjI6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI1MzoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjU0OjI6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNTA0NTUsMjIgKzUwNTAxLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyNTQ6MTogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggJ251bGwnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI2MDoxOiBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAnbnVsbCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyNTg6MTogKCAoICdudWxsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI1OToxOiAoICdudWxsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyNjQ6MTogKCAoICdudWxsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI2NToxOiAoICdudWxsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyNTk6MTogKCAnbnVsbCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjYwOjI6ICdudWxsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjY1OjE6ICggJ251bGwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI2NjoyOiAnbnVsbCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0TnVsbEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5NSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0TnVsbEtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MDQ5NiwxNCArNTA1NDIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjcwOjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCA6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI3NjoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mjc0OjE6ICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyNzU6MjogcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjgwOjE6ICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyODE6MjogcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA3KTsKICAgICAgICAgICAgIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTA1MzQsMjMgKzUwNTgwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI4MjoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI4ODoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyODY6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mjg3OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjkyOjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI5MzoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI4NzoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI4ODoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MjkzOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mjk0OjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bWJlckxpdGVyYWxBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUyODk6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI4OTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTI5NToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mjk1OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01MDU3NSwxNCArNTA2MjEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mjk3OjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzAzOjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMwMToxOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMDI6MjogcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMDc6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzA4OjI6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTUwNjA4LDIzICs1MDY1NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMDg6MTogcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMxNDoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMxMjoxOiAoICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMxMzoxOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzE4OjE6ICggKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzE5OjE6ICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMTM6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMxNDoyOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMTk6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMyMDoyOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzE1OjI6ICggcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMxNTozOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMyMToyOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMjE6MzogcnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSgpOwpAQCAtNTA2NTksMTQgKzUwNzA1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMyNDoxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMzA6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wIDogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMyODoxOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzI5OjI6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTMzNDoxOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzM1OjI6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEwOCk7CiAgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTUwNjk3LDIzICs1MDc0MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzMzY6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNDI6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzQwOjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM0MToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM0NjoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNDc6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNDE6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNDI6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM0NzoxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM0ODoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzQzOjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNDM6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNDk6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM0OTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTA3MzgsMTQgKzUwNzg0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM1MToxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM1NzoxOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNTU6MTogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzU2OjI6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzYxOjE6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM2MjoyOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01MDc3MSwyMyArNTA4MTcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzYyOjE6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNjg6MTogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNjY6MTogKCAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNjc6MTogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM3MjoxOiAoICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM3MzoxOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzY3OjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNjg6MjogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzczOjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNzQ6MjogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM2OToyOiAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNjk6MzogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzNzU6MjogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mzc1OjM6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEoKTsKQEAgLTUwODIyLDE0ICs1MDg2OCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mzc4OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM4NDoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wIDogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM4MjoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzODM6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzODg6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mzg5OjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTA5KTsKICAgICAgICAgICAgIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTUwODYwLDIzICs1MDkwNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1MzkwOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM5NjoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTM5NDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzOTU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MDA6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDAxOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mzk1OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mzk2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MDE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MDI6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsQWN0aW9uXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Mzk3OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTUzOTc6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MDM6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQwMzozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTA5MDEsMTQgKzUwOTQ3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MDU6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMSA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDExOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzEgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDA5OjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQxMDoyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQxNToxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MTY6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNyk7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01MDkzOSwyMiArNTA5ODUsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQxNzoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18xX19JbXBsIDogKCAndHlwZW9mJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MjM6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCA6ICggJ3R5cGVvZicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0MjE6MTogKCAoICd0eXBlb2YnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDIyOjE6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDI3OjE6ICggKCAndHlwZW9mJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQyODoxOiAoICd0eXBlb2YnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQyMjoxOiAoICd0eXBlb2YnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQyMzoyOiAndHlwZW9mJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDI4OjE6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDI5OjI6ICd0eXBlb2YnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFR5cGVvZktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5NixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5NyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZW9mS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUwOTgwLDE0ICs1MTAyNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDMyOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzIgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQzODoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yIDogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQzNjoxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0Mzc6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0NDI6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDQzOjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNyk7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MTAxOCwyMiArNTEwNjQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ0NDoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsIDogKCAnKCcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDUwOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzJfX0ltcGwgOiAoICcoJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ0ODoxOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDQ5OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ1NDoxOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDU1OjE6ICggJygnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ0OToxOiAoICcoJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0NTA6MjogJygnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0NTU6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDU2OjI6ICcoJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01MTA1OSwxNCArNTExMDUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ1OToxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zIDogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0NjU6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMyA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0NjM6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDY0OjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDY5OjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fM19fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ3MDoyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsKCk7CkBAIC01MTA5NywyMyArNTExNDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ3MToxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ3NzoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDc1OjE6ICggKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDc2OjE6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0ODE6MTogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0ODI6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ3NjoxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDc3OjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ4MjoxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDgzOjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMygpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0Nzg6MjogKCBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDc4OjM6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDg0OjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ4NDozOiBydWxlX19YVHlwZUxpdGVyYWxfX1R5cGVBc3NpZ25tZW50XzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zKCk7CkBAIC01MTE0OCwxNCArNTExOTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ4NjoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180IDogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0OTI6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU0OTA6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDkxOjI6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwgcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NDk2OjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNF9fSW1wbCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ5NzoyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMCk7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsKCk7CkBAIC01MTE4NiwzNSArNTEyMzIsMzUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTQ5ODoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUwNDoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX180X19JbXBsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzRfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTAyOjE6ICggKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTAzOjE6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MDg6MTogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MDk6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUwMzoxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTA0OjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUwOToxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTEwOjI6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0QXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUwNToyOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80ICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MTE6MjogKCBydWxlX19YVHlwZUxpdGVyYWxfX0FycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCApKgogICAgICAgICAgICAgbG9vcDEyNjoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTI2PTI7CiAgICAgICAgICAgICAgICAgaW50IExBMTI2XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTI2XzA9PTgzKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEyNl8wPT04NCkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDEyNj0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMjYpIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MDU6MzogcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTExOjM6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80CiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTExKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQoKTsKQEAgLTUxMjU1LDE0ICs1MTMwMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTEzOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUgOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MTk6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNSA6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzVfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTE3OjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MTg6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTIzOjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MjQ6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fNV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsKCk7CkBAIC01MTI4OCwyMiArNTEzMzQsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUyNDoxOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTMwOjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzVfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX181X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUyODoxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTI5OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUzNDoxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTM1OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTUyOToxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MzA6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1MzU6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTM2OjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF81KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF81KCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUxMzI5LDE0ICs1MTM3NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU0MDoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NDY6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTQ0OjE6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTQ1OjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NTA6MTogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NTE6MjogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMik7CiAgICAgICAgICAgICBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTEzNjcsMjMgKzUxNDEzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTUyOjE6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NTg6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU1NjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NTc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NjI6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTYzOjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTU3OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTU4OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NjM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NjQ6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUaHJvd0V4cHJlc3Npb25BY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1NTk6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU1OTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU2NToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTY1OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01MTQwOCwxNCArNTE0NTQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1Njc6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzEgOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTczOjE6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU3MToxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU3MjoyOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTc3OjE6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTc4OjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNTE0NDYsMjIgKzUxNDkyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTc5OjE6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAndGhyb3cnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU4NToxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCA6ICggJ3Rocm93JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1ODM6MTogKCAoICd0aHJvdycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1ODQ6MTogKCAndGhyb3cnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU4OToxOiAoICggJ3Rocm93JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU5MDoxOiAoICd0aHJvdycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTg0OjE6ICggJ3Rocm93JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1ODU6MjogJ3Rocm93JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NTkwOjE6ICggJ3Rocm93JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1OTE6MjogJ3Rocm93JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VGhyb3dLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsOTgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaHJvd0tleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MTQ4NywxNCArNTE1MzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU1OTQ6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjAwOjE6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU5ODoxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTU5OToyOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjA0OjE6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjA1OjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MTUyMCwyMyArNTE1NjYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MDU6MTogcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxMToxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjA5OjE6ICggKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxMDoxOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxNToxOiAoICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MTY6MTogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MTA6MTogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MTE6MjogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxNjoxOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxNzoyOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MTI6MjogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxMjozOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MTg6MjogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYxODozOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIoKTsKQEAgLTUxNTcxLDE0ICs1MTYxNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MjE6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjI3OjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MjU6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYyNjoyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2MzE6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYzMjoyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTMpOwogICAgICAgICAgICAgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CkBAIC01MTYwOSwyMyArNTE2NTUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjMzOjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjM5OjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTYzNzoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2Mzg6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NDM6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjQ0OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjM4OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjM5OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NDQ6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NDU6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY0MDoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjQwOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjQ2OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NDY6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTUxNjUwLDE0ICs1MTY5NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NDg6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjU0OjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NTI6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY1MzoyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NTg6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY1OToyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTUxNjg4LDIyICs1MTczNCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NjA6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAncmV0dXJuJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NjY6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAncmV0dXJuJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjY0OjE6ICggKCAncmV0dXJuJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY2NToxOiAoICdyZXR1cm4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY3MDoxOiAoICggJ3JldHVybicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NzE6MTogKCAncmV0dXJuJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NjU6MTogKCAncmV0dXJuJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2NjY6MjogJ3JldHVybicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY3MToxOiAoICdyZXR1cm4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY3MjoyOiAncmV0dXJuJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFJldHVybktleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw5OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSZXR1cm5LZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTE3MjksMTQgKzUxNzc1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY3NToxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY4MToxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2Nzk6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjgwOjI6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Njg1OjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY4NjoyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MTc2MiwyNyArNTE4MDgsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Njg2OjE6IHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTI6MTogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTA6MTogKCAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTE6MTogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY5NjoxOiAoICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY5NzoxOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjkxOjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTI6MjogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Njk3OjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTg6MjogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NjkzOjI6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY5OToyOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/CiAgICAgICAgICAgICBpbnQgYWx0MTI3PTI7CiAgICAgICAgICAgICBhbHQxMjcgPSBkZmExMjcucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyNykgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY5MzozOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTk6MzogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIoKTsKQEAgLTUxODIwLDE0ICs1MTg2NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MDI6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzA4OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MDY6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTcwNzoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MTI6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTcxMzoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTQpOwogICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCk7CkBAIC01MTg1OCwyMyArNTE5MDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzE0OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzIwOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTcxODoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MTk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MjQ6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzI1OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzE5OjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzIwOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MjU6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MjY6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjdGlvbl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTcyMToyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzIxOjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzI3OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3Mjc6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTUxODk5LDE0ICs1MTk0NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3Mjk6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzM1OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3MzM6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTczNDoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3Mzk6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc0MDoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180MSk7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTUxOTM3LDIyICs1MTk4MywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NDE6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAndHJ5JyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NDc6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAndHJ5JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzQ1OjE6ICggKCAndHJ5JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc0NjoxOiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc1MToxOiAoICggJ3RyeScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NTI6MTogKCAndHJ5JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NDY6MTogKCAndHJ5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NDc6MjogJ3RyeScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc1MjoxOiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc1MzoyOiAndHJ5JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldFRyeUtleXdvcmRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw5OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHJ5S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUxOTc4LDE0ICs1MjAyNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NTY6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzYyOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMiA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NjA6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc2MToyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NjY6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc2NzoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTUpOwogICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MjAxNiwyMyArNTIwNjIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzY4OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc3NDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzcyOjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NzM6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Nzc4OjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3Nzk6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzczOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc3NDoyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc3OToxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3ODA6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NzU6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3NzU6MzogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc4MToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc4MTozOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpOwpAQCAtNTIwNjcsMTQgKzUyMTEzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc4MzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc4OToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzMgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3ODc6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Nzg4OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1NzkzOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTc5NDoyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsKCk7CkBAIC01MjEwMCwyMyArNTIxNDYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Nzk0OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MDA6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3OTg6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU3OTk6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgwNDoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgwNToxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1Nzk5OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MDA6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODA1OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MDY6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgwMToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MDE6MzogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MDc6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODA3OjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMoKTsKQEAgLTUyMTUxLDE0ICs1MjE5NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODEwOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzAgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgxNjoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgxNDoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MTU6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MjA6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODIxOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE2KTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwoKTsKQEAgLTUyMTg5LDI2ICs1MjIzNSwyNiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODIyOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODI4OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzBfX0ltcGwgOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MjY6MTogKCAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4Mjc6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSApICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzMjoxOiAoICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzMzoxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkgKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODI3OjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4Mjg6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODMzOjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzQ6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkgKSAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODI4OjI6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgyOTozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzNDoyOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzU6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzA6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzA6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzNjozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzNjo0OiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE3KTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCk7CkBAIC01MjIyNCwyMiArNTIyNzAsMjIgQEAKIAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzM6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzNDozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4Mzk6MjogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg0MDozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzU6MzogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODQxOjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKSoKICAgICAgICAgICAgIGxvb3AxMjg6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDEyOD0yOwogICAgICAgICAgICAgICAgIGludCBMQTEyOF8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEyOF8wPT0xMDIpICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTI4XzA9PTEwMykgKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTEyOF8yID0gaW5wdXQuTEEoMik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMjg9MTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01MjI0OSw3ICs1MjI5NSw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyOCkgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzNTo0OiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMAorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NDE6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMTcpOwogICAgICAgICAgICAgCSAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpOwpAQCAtNTIyOTMsMTQgKzUyMzM5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NDQ6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg1MDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NDg6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg0OToyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NTQ6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg1NToyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwoKTsKQEAgLTUyMzI2LDM1ICs1MjM3MiwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODU1OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg2MToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg1OToxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NjA6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NjU6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODY2OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODYwOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODYxOjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NjY6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4Njc6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NjI6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg2ODoyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApPwogICAgICAgICAgICAgaW50IGFsdDEyOT0yOwogICAgICAgICAgICAgaW50IExBMTI5XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMjlfMD09MTAwKSApIHsKKyAgICAgICAgICAgIGlmICggKExBMTI5XzA9PTEwMSkgKSB7CiAgICAgICAgICAgICAgICAgaW50IExBMTI5XzEgPSBpbnB1dC5MQSgyKTsKIAotICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzdfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDEyOT0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODYyOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4Njg6MzogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCgpOwpAQCAtNTIzOTIsMTQgKzUyNDM4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg3MToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4Nzc6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg3NToxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODc2OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg4MToxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODgyOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCgpOwpAQCAtNTI0MzAsMjUgKzUyNDc2LDI1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg4MzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwgOiAoICggJ2ZpbmFsbHknICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODg5OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMF9fSW1wbCA6ICggKCAnZmluYWxseScgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODg3OjE6ICggKCAoICdmaW5hbGx5JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODg4OjE6ICggKCAnZmluYWxseScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4OTM6MTogKCAoICggJ2ZpbmFsbHknICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4OTQ6MTogKCAoICdmaW5hbGx5JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg4ODoxOiAoICggJ2ZpbmFsbHknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODg5OjI6ICggJ2ZpbmFsbHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg5NDoxOiAoICggJ2ZpbmFsbHknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODk1OjI6ICggJ2ZpbmFsbHknICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5S2V5d29yZF8zXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg5MDoyOiAoICdmaW5hbGx5JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4OTA6MzogJ2ZpbmFsbHknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4OTY6MjogKCAnZmluYWxseScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODk2OjM6ICdmaW5hbGx5JwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKICAgICAgICAgICAgIH0KIApAQCAtNTI0NzcsMTQgKzUyNTIzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg5ODoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkwNDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzEgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MDI6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTAzOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTA4OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkwOToyOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsKCk7CkBAIC01MjUxMCwyMyArNTI1NTYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTA5OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MTU6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MTM6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MTQ6MTogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkxOToxOiAoICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkyMDoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTE0OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MTU6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTIwOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MjE6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkxNjoyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MTY6MzogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MjI6MjogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTIyOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEoKTsKQEAgLTUyNTYxLDE0ICs1MjYwNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTI1OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkzMToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTkyOToxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MzA6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5MzU6MTogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTM2OjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzBfX0ltcGwgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDEpOwogICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpOwpAQCAtNTI1OTksMjIgKzUyNjQ1LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5Mzc6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCA6ICggJ2ZpbmFsbHknICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk0MzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wX19JbXBsIDogKCAnZmluYWxseScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5NDE6MTogKCAoICdmaW5hbGx5JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk0MjoxOiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5NDc6MTogKCAoICdmaW5hbGx5JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk0ODoxOiAoICdmaW5hbGx5JyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5NDI6MTogKCAnZmluYWxseScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTQzOjI6ICdmaW5hbGx5JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTQ4OjE6ICggJ2ZpbmFsbHknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk0OToyOiAnZmluYWxseScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5S2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTUyNjQwLDE0ICs1MjY4NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTUyOjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEgOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5NTg6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMSA6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTU2OjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5NTc6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTYyOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5NjM6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsKCk7CkBAIC01MjY3MywyMyArNTI3MTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk2MzoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5Njk6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCA6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5Njc6MTogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTY4OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTczOjE6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk3NDoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk2ODoxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk2OToyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTc0OjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTc1OjI6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk3MDoyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTcwOjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk3NjoyOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTc2OjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19GaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSgpOwpAQCAtNTI3MjQsMTQgKzUyNzcwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk3OToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5ODU6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk4MzoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTg0OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk4OToxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTkwOjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTI3NjIsMjMgKzUyODA4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk5MToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5OTc6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk5NToxOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTk2OjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAwMToxOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDAyOjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTk5NjoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU5OTc6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMDI6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDAzOjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTk4OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1OTk4OjM6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMDQ6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMDQ6MzogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAoKTsKQEAgLTUyODEzLDE0ICs1Mjg1OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMDY6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDEyOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMTA6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAxMToyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMTY6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAxNzoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTUyODUxLDIzICs1Mjg5NywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMTg6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAyNDoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAyMjoxOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAyMzoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDI4OjE6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDI5OjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMjM6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAyNDoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMjk6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAzMDoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1Bc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDI1OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAyNTozOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAzMToyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMzE6MzogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX1BhcmFtQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSgpOwpAQCAtNTI5MDIsMTQgKzUyOTQ4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAzMzoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzIgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwMzk6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjAzNzoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDM4OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA0MzoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDQ0OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNTI5NDAsMjIgKzUyOTg2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA0NToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzJfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNTE6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsIDogKCAnKScgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA0OToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDUwOjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA1NToxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDU2OjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA1MDoxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNTE6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNTY6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDU3OjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsgCiAgICAgICAgICAgICB9CkBAIC01Mjk4MSwxNCArNTMwMjcsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDYwOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDY2OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMyA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA2NDoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNjU6MjogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNzA6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDcxOjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTUzMDE0LDIzICs1MzA2MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNzE6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18zX19JbXBsIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDc3OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fM19fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNzU6MTogKCAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA3NjoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwODE6MTogKCAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA4MjoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwNzY6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDc3OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDgyOjE6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA4MzoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8zKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA3ODoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA3ODozOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDg0OjI6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDg0OjM6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zKCk7CkBAIC01MzA2NSwxNCArNTMxMTEsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwODc6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDkzOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA5MToxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjA5MjoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDk3OjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MDk4OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wX18wX19JbXBsKCk7CkBAIC01MzA5OCwyMyArNTMxNDQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYwOTg6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwgOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEwNDoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTAyOjE6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEwMzoxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEwODoxOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMDk6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMDM6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMDQ6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEwOToxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjExMDoyOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMDU6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEwNTozOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMTE6MjogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjExMTozOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAoKTsKQEAgLTUzMTQ5LDE0ICs1MzE5NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTE0OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEyMDoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjExODoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMTk6MjogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMF9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMjQ6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTI1OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE4KTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwoKTsKQEAgLTUzMTg3LDIzICs1MzIzMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTI2OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEzMjoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEzMDoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMzE6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMzY6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTM3OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTMxOjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTMyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMzc6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMzg6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjdGlvbl8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxMzM6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEzMzozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjEzOToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTM5OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01MzIyOCwxNCArNTMyNzQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE0MToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNDc6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMSA6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNDU6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTQ2OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTUxOjE6ICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMV9fSW1wbCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE1MjoyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzM3KTsKICAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwoKTsKQEAgLTUzMjY2LDIyICs1MzMxMiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTUzOjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzFfX0ltcGwgOiAoICdzeW5jaHJvbml6ZWQnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE1OToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsIDogKCAnc3luY2hyb25pemVkJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE1NzoxOiAoICggJ3N5bmNocm9uaXplZCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNTg6MTogKCAnc3luY2hyb25pemVkJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNjM6MTogKCAoICdzeW5jaHJvbml6ZWQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTY0OjE6ICggJ3N5bmNocm9uaXplZCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTU4OjE6ICggJ3N5bmNocm9uaXplZCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTU5OjI6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNjQ6MTogKCAnc3luY2hyb25pemVkJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNjU6MjogJ3N5bmNocm9uaXplZCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTeW5jaHJvbml6ZWRLZXl3b3JkXzBfMF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDIsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3luY2hyb25pemVkS2V5d29yZF8wXzBfMSgpKTsgCiAgICAgICAgICAgICB9CkBAIC01MzMwNywxNCArNTMzNTMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE2ODoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yIDogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTc0OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzIgOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE3MjoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTczOjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE3ODoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTc5OjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCgpOwpAQCAtNTMzNDAsMjIgKzUzMzg2LDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxNzk6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE4NToxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18yX19JbXBsIDogKCAnKCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMl9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxODM6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE4NDoxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxODk6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE5MDoxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxODQ6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTg1OjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTkwOjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjE5MToyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wXzIoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTMzODEsMTQgKzUzNDI3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYxOTU6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCA6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjAxOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MTk5OjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIwMDoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIwNToxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMDY6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zNyk7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsKCk7CkBAIC01MzQxOSwyNSArNTM0NjUsMjUgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIwNzoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX19JbXBsIDogKCAoICdjYXRjaCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMTM6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMF9fSW1wbCA6ICggKCAnY2F0Y2gnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMTE6MTogKCAoICggJ2NhdGNoJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjEyOjE6ICggKCAnY2F0Y2gnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjE3OjE6ICggKCAoICdjYXRjaCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIxODoxOiAoICggJ2NhdGNoJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIxMjoxOiAoICggJ2NhdGNoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIxMzoyOiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjE4OjE6ICggKCAnY2F0Y2gnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjE5OjI6ICggJ2NhdGNoJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldENhdGNoS2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIxNDoyOiAoICdjYXRjaCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjE0OjM6ICdjYXRjaCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIyMDoyOiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjIwOjM6ICdjYXRjaCcKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwMixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCiAgICAgICAgICAgICB9CiAKQEAgLTUzNDY2LDE0ICs1MzUxMiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjIyOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzEgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIyODoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xIDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIyNjoxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMjc6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMzI6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjMzOjI6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNTM1MDQsMjIgKzUzNTUwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMzQ6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCA6ICggJygnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI0MDoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18xX19JbXBsIDogKCAnKCcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMzg6MTogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjIzOToxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyNDQ6MTogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI0NToxOiAoICcoJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyMzk6MTogKCAnKCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjQwOjI6ICcoJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjQ1OjE6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI0NjoyOiAnKCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTM1NDUsMTQgKzUzNTkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyNDk6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMiA6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMyA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjU1OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIgOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzMgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjUzOjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI1NDoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI1OToxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzJfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyNjA6MjogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMl9fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Nik7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsKCk7CkBAIC01MzU4MywyMyArNTM2MjksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI2MToxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI2NzoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjY1OjE6ICggKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjY2OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyNzE6MTogKCAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyNzI6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI2NjoxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjY3OjI6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI3MjoxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjczOjI6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyNjg6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjY4OjM6IHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mjc0OjI6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI3NDozOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yKCk7CkBAIC01MzYzNCwxNCArNTM2ODAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI3NjoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zIDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180IDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyODI6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMyA6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyODA6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjgxOjI6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mjg2OjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI4NzoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18zX19JbXBsIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzQxKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwoKTsKQEAgLTUzNjcyLDIyICs1MzcxOCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mjg4OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwgOiAoICcpJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyOTQ6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fM19fSW1wbCA6ICggJyknICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjkyOjE6ICggKCAnKScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyOTM6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mjk4OjE6ICggKCAnKScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYyOTk6MTogKCAnKScgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MjkzOjE6ICggJyknICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI5NDoyOiAnKScKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjI5OToxOiAoICcpJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMDA6MjogJyknCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsODAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzMoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTM3MTMsMTQgKzUzNzU5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMDM6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNCA6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMwOToxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180IDogcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMDc6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMwODoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMTM6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMxNDoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX180X19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwoKTsKQEAgLTUzNzQ2LDIzICs1Mzc5MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzE0OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzIwOjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzRfX0ltcGwgOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fNF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMTg6MTogKCAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMTk6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMyNDoxOiAoICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMyNToxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80ICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzE5OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMjA6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzI1OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMjY6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF80KCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMyMToyOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMjE6MzogcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMjc6MjogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzI3OjM6IHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQoKTsKQEAgLTUzNzk3LDE0ICs1Mzg0MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjMzMDoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCA6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzMzY6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzM0OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzM1OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNDA6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNDE6MjogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTM4MzUsMTcgKzUzODgxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzQyOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsIDogKCBydWxlVmFsaWRJRCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNDg6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM0NjoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNDc6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNTI6MTogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzUzOjE6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzQ3OjE6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzQ4OjI6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNTM6MTogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNTQ6MjogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTUzODgwLDE0ICs1MzkyNiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM1NzoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMSA6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNjM6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzYxOjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzYyOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNjc6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNjg6MjogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTUzOTEzLDIyICs1Mzk1OSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM2ODoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM3NDoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM3MjoxOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzczOjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM3ODoxOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mzc5OjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM3MzoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNzQ6MjogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNzk6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzgwOjI6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNzU6MjogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzODE6MjogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkqCiAgICAgICAgICAgICBsb29wMTMwOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMzA9MjsKQEAgLTUzOTQwLDcgKzUzOTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMzBfMj09UlVMRV9JRCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzBfMyA9IGlucHV0LkxBKDMpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc5X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTMwPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTUzOTUzLDcgKzUzOTk5LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMwKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mzc1OjM6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2MzgxOjM6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMjApOwogICAgICAgICAgICAgCSAgICBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wKCk7CkBAIC01Mzk5NCwxNCArNTQwNDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM4NDoxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzOTA6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzODg6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mzg5OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mzk0OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM5NToyOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtNTQwMzIsMjMgKzU0MDc4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzOTY6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCAnLicgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MDI6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCAnLicgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQwMDoxOiAoICggKCAnLicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQwMToxOiAoICggJy4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDA2OjE6ICggKCAoICcuJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDA3OjE6ICggKCAnLicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MDE6MTogKCAoICcuJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQwMjoyOiAoICcuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MDc6MTogKCAoICcuJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQwODoyOiAoICcuJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQwMzoyOiAoICcuJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MDM6MzogJy4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MDk6MjogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDA5OjM6ICcuJwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goaW5wdXQsNDMsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogCkBAIC01NDA3OSwxNCArNTQxMjUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQxMToxOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xIDogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDE3OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQxNToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDE2OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQyMToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDIyOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbCgpOwpAQCAtNTQxMTIsMTcgKzU0MTU4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MjI6MTogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbCA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDI4OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDI2OjE6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQyNzoxOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQzMjoxOiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0MzM6MTogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0Mjc6MTogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0Mjg6MjogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQzMzoxOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQzNDoyOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMSgpKTsgCkBAIC01NDE1NywxNCArNTQyMDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDM4OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ0NDoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzAgOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDQyOjE6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NDM6MjogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDQ4OjE6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NDk6MjogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTE5KTsKICAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCgpOwpAQCAtNTQxOTUsMjMgKzU0MjQxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTnVtYmVyX19Hcm91cF8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ1MDoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDU2OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDU0OjE6ICggKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDU1OjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NjA6MTogKCAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NjE6MTogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ1NToxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDU2OjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ2MToxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDYyOjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NTc6MjogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDU3OjM6IHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDYzOjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ2MzozOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wKCk7CkBAIC01NDI0NiwxNCArNTQyOTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDY1OjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMSA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDcxOjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMSA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ2OToxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NzA6MjogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NzU6MTogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDc2OjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwoKTsKQEAgLTU0Mjc5LDIyICs1NDMyNSwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0NzY6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ4MjoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTnVtYmVyX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ4MDoxOiAoICggKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ4MToxOiAoICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDg2OjE6ICggKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDg3OjE6ICggKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0ODE6MTogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ4MjoyOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0ODc6MTogKCAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ4ODoyOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wICk/CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0ODM6MjogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDg5OjI6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAgKT8KICAgICAgICAgICAgIGludCBhbHQxMzE9MjsKICAgICAgICAgICAgIGludCBMQTEzMV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTU0MzA3LDcgKzU0MzUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDgzOjM6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ4OTozOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCgpOwpAQCAtNTQzNDUsMTQgKzU0MzkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NDkyOjE6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wIDogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjQ5ODoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0OTY6MTogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY0OTc6MjogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzBfX0ltcGwgcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUwMjoxOiAoIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUwMzoyOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMF9fSW1wbCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIxKTsKICAgICAgICAgICAgIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wX19JbXBsKCk7CkBAIC01NDM4MywxNyArNTQ0MjksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MDQ6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICcuJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MTA6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzBfX0ltcGwgOiAoICcuJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MDg6MTogKCAoICcuJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUwOToxOiAoICcuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MTQ6MTogKCAoICcuJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUxNToxOiAoICcuJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MDk6MTogKCAnLicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTEwOjI6ICcuJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTE1OjE6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUxNjoyOiAnLicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wKCkpOyAKQEAgLTU0NDI0LDE0ICs1NDQ3MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUxOToxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMSA6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MjU6MTogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzEgOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTIzOjE6ICggcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTI0OjI6IHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1Mjk6MTogKCBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MzA6MjogcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzFfX0ltcGwoKTsKQEAgLTU0NDU3LDIzICs1NDUwMywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUzMDoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUzNjoxOiBydWxlX19OdW1iZXJfX0dyb3VwXzFfMV9fMV9fSW1wbCA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUzNDoxOiAoICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTM1OjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU0MDoxOiAoICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTQxOjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjUzNToxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1MzY6MjogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NDE6MTogKCAoIHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTQyOjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTM3OjI6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTM3OjM6IHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NDM6MjogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NDM6MzogcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEoKTsKQEAgLTU0NTA4LDE0ICs1NDU1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTQ2OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU1MjoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU1MDoxOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NTE6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NTY6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTU3OjI6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDUpOwogICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCgpOwpAQCAtNTQ1NDYsMTcgKzU0NTkyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NTg6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCA6ICggcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU2NDoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wX19JbXBsIDogKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NjI6MTogKCAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU2MzoxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1Njg6MTogKCAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU2OToxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1NjM6MTogKCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTY0OjI6IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTY5OjE6ICggcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU3MDoyOiBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKQEAgLTU0NTkxLDE0ICs1NDYzNywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTczOjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1Nzk6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMSA6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTc3OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1Nzg6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTgzOjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1ODQ6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsKCk7CkBAIC01NDYyNCwzNCArNTQ2NzAsMzQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU4NDoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1OTA6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1ODg6MTogKCAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTg5OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTk0OjE6ICggKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU5NToxOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU4OToxOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU5MDoyOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTk1OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTk2OjI6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTkxOjI6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1OTc6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3AxMzI6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDEzMj0yOwogICAgICAgICAgICAgICAgIGludCBMQTEzMl8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEzMl8wPT04MykgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMzJfMD09ODQpICkgewogICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzJfMiA9IGlucHV0LkxBKDIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICggKExBMTMyXzI9PTgxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMzJfMj09ODIpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTMyXzMgPSBpbnB1dC5MQSgzKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE4MF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE4MV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzMj0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NDY2NCw3ICs1NDcxMCw3IEBACiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzMikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU5MTozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NTk3OjM6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzExMSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCgpOwpAQCAtNTQ3MDUsMTQgKzU0NzUxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYwMDoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYwNjoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MDQ6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjA1OjI6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMF9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjEwOjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYxMToyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wX19JbXBsKCk7CkBAIC01NDczOCwyMyArNTQ3ODQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjExOjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYxNzoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjE1OjE6ICggKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MTY6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjIxOjE6ICggKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MjI6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjE2OjE6ICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYxNzoyOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYyMjoxOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MjM6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MTg6MjogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MTg6MzogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYyNDoyOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYyNDozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCgpOwpAQCAtNTQ3ODksMTQgKzU0ODM1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjI3OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wIDogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzBfX0ltcGwgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYzMzoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCA6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wX19JbXBsIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MzE6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2MzI6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzBfX0ltcGwgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYzNzoxOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wX19JbXBsIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYzODoyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDUpOwogICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzBfX0ltcGwoKTsKQEAgLTU0ODI3LDIzICs1NDg3MywyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjYzOToxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjQ1OjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wX19JbXBsIDogKCAoKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2NDM6MTogKCAoICgpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjQ0OjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjQ5OjE6ICggKCAoKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY1MDoxOiAoICgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY0NDoxOiAoICgpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY0NToyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjUwOjE6ICggKCkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjUxOjI6ICgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlQ29tcG9uZW50VHlwZUFjdGlvbl8wXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY0NjoyOiAoKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjQ2OjM6IAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjUyOjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2NTI6MzogCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9CiAKQEAgLTU0ODY4LDE0ICs1NDkxNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY1NDoxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMSA6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2NjA6MTogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzEgOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjU4OjE6ICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjU5OjI6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2NjQ6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2NjU6MjogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzFfX0ltcGwoKTsKQEAgLTU0OTAxLDE3ICs1NDk0NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY2NToxOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMV9fSW1wbCA6ICggcnVsZUFycmF5QnJhY2tldHMgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjcxOjE6IHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18xX19JbXBsIDogKCBydWxlQXJyYXlCcmFja2V0cyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2Njk6MTogKCAoIHJ1bGVBcnJheUJyYWNrZXRzICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjcwOjE6ICggcnVsZUFycmF5QnJhY2tldHMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njc1OjE6ICggKCBydWxlQXJyYXlCcmFja2V0cyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY3NjoxOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY3MDoxOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY3MToyOiBydWxlQXJyYXlCcmFja2V0cworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njc2OjE6ICggcnVsZUFycmF5QnJhY2tldHMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njc3OjI6IHJ1bGVBcnJheUJyYWNrZXRzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcnJheUJyYWNrZXRzUGFyc2VyUnVsZUNhbGxfMF8xXzBfMSgpKTsgCkBAIC01NDk0NiwxNCArNTQ5OTIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2ODE6MTogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMF9fSW1wbCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njg3OjE6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wIDogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY4NToxOiAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY4NjoyOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMF9fSW1wbCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjkxOjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjkyOjI6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV184Myk7CiAgICAgICAgICAgICBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTQ5ODQsMjIgKzU1MDMwLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NjkzOjE6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wX19JbXBsIDogKCAnWycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njk5OjE6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wX19JbXBsIDogKCAnWycgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njk3OjE6ICggKCAnWycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY2OTg6MTogKCAnWycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzAzOjE6ICggKCAnWycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MDQ6MTogKCAnWycgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Njk4OjE6ICggJ1snICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjY5OToyOiAnWycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcwNDoxOiAoICdbJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MDU6MjogJ1snCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw4MyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw4NCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU1MDI1LDE0ICs1NTA3MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcwODoxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMSA6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MTQ6MTogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEgOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzEyOjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzEzOjI6IHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MTg6MTogKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MTk6MjogcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTU1MDU4LDIyICs1NTEwNCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcxOToxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCA6ICggJ10nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcyNToxOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMV9fSW1wbCA6ICggJ10nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcyMzoxOiAoICggJ10nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzI0OjE6ICggJ10nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcyOToxOiAoICggJ10nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzMwOjE6ICggJ10nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjcyNDoxOiAoICddJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MjU6MjogJ10nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3MzA6MTogKCAnXScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzMxOjI6ICddJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgyLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU1MDk5LDE0ICs1NTE0NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjczNToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NDE6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzM5OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzQwOjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NDU6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NDY6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wX19JbXBsKCk7CkBAIC01NTEzNywzMSArNTUxODMsMzEgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NDc6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NTM6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NTE6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc1MjoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NTc6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc1ODoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NTI6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzUzOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzU4OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc1OToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzU0OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzYwOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCApPwogICAgICAgICAgICAgaW50IGFsdDEzMz0yOwogICAgICAgICAgICAgaW50IExBMTMzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMzNfMD09NzgpICkgeworICAgICAgICAgICAgaWYgKCAoTEExMzNfMD09NzkpICkgewogICAgICAgICAgICAgICAgIGFsdDEzMz0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxMzMpIHsKICAgICAgICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NTQ6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NjA6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wKCk7CkBAIC01NTE5OSwxNCArNTUyNDUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3NjI6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzEgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzY4OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc2NjoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc2NzoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzcyOjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2NzczOjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OCk7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNTUyMzcsMTcgKzU1MjgzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Nzc0OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18xX19JbXBsIDogKCAnPT4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc4MDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCA6ICggJz0+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3Nzg6MTogKCAoICc9PicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3Nzk6MTogKCAnPT4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc4NDoxOiAoICggJz0+JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc4NToxOiAoICc9PicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Nzc5OjE6ICggJz0+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3ODA6MjogJz0+JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Nzg1OjE6ICggJz0+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3ODY6MjogJz0+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMSgpKTsgCkBAIC01NTI3OCwxNCArNTUzMjQsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY3ODk6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzIgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Nzk1OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc5MzoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjc5NDoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Nzk5OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODAwOjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18yX19JbXBsKCk7CkBAIC01NTMxMSwyMyArNTUzNTcsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MDA6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgwNjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMl9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODA0OjE6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgwNToxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgxMDoxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MTE6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MDU6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MDY6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgxMToxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgxMjoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MDc6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgwNzozOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MTM6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgxMzozOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19SZXR1cm5UeXBlQXNzaWdubWVudF8yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIoKTsKQEAgLTU1MzYyLDE0ICs1NTQwOCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODE2OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgyMjoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgyMDoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MjE6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MjY6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODI3OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIyKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwoKTsKQEAgLTU1NDAwLDIyICs1NTQ0NiwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODI4OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwgOiAoICcoJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MzQ6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMF9fSW1wbCA6ICggJygnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODMyOjE6ICggKCAnKCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4MzM6MTogKCAnKCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODM4OjE6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4Mzk6MTogKCAnKCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODMzOjE6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgzNDoyOiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjgzOToxOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NDA6MjogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCw3OCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCw3OSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU1NDQxLDE0ICs1NTQ4NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODQzOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzEgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg0OToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg0NzoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NDg6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMV9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NTM6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODU0OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMgogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMTIyKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwoKTsKQEAgLTU1NDc5LDMxICs1NTUyNSwzMSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODU1OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wICk/ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg2MToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg1OToxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NjA6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NjU6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODY2OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODYwOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODYxOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NjY6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4Njc6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NjI6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg2ODoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCApPwogICAgICAgICAgICAgaW50IGFsdDEzND0yOwogICAgICAgICAgICAgaW50IExBMTM0XzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgaWYgKCAoTEExMzRfMD09UlVMRV9JRHx8TEExMzRfMD09MzF8fExBMTM0XzA9PTc4KSApIHsKKyAgICAgICAgICAgIGlmICggKExBMTM0XzA9PVJVTEVfSUR8fExBMTM0XzA9PTMxfHxMQTEzNF8wPT03OSkgKSB7CiAgICAgICAgICAgICAgICAgYWx0MTM0PTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg2MjozOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODY4OjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAoKTsKQEAgLTU1NTQxLDE0ICs1NTU4NywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODcwOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NzY6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMiA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODc0OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4NzU6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODgwOjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4ODE6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsKCk7CkBAIC01NTU3NCwyMiArNTU2MjAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg4MToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsIDogKCAnKScgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODg3OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfXzJfX0ltcGwgOiAoICcpJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg4NToxOiAoICggJyknICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODg2OjE6ICggJyknICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg5MToxOiAoICggJyknICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODkyOjE6ICggJyknICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjg4NjoxOiAoICcpJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4ODc6MjogJyknCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4OTI6MTogKCAnKScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2ODkzOjI6ICcpJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU1NjE1LDE0ICs1NTY2MSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY4OTc6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTAzOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MDE6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkwMjoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MDc6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkwODoyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18zOSk7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzBfX0ltcGwoKTsKQEAgLTU1NjUzLDIzICs1NTY5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MDk6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18wX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTE1OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCA6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MTM6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkxNDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MTk6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkyMDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MTQ6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTE1OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTIwOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkyMToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkxNjoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkxNjozOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTIyOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzAgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTIyOjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCk7CkBAIC01NTcwNCwxNCArNTU3NTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTI0OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTMwOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkyODoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5Mjk6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MzQ6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTM1OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwoKTsKQEAgLTU1NzM3LDM1ICs1NTc4MywzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5MzU6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk0MToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjkzOToxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk0MDoxOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTQ1OjE6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTQ2OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NDA6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk0MToyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NDY6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk0NzoyOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wICkqCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NDI6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTQ4OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgKSoKICAgICAgICAgICAgIGxvb3AxMzU6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDEzNT0yOwogICAgICAgICAgICAgICAgIGludCBMQTEzNV8wID0gaW5wdXQuTEEoMSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIChMQTEzNV8wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExMzVfMD09ODEpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQxMzU9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM1KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTQyOjM6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk0ODozOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMAogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzQwKTsKICAgICAgICAgICAgIAkgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAoKTsKQEAgLTU1ODA2LDE0ICs1NTg1MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk1MToxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NTc6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAgOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTU1OjE6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTU2OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wX19JbXBsIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NjE6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMF9fSW1wbCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NjI6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzU4KTsKICAgICAgICAgICAgIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wX19JbXBsKCk7CkBAIC01NTg0NCwyMiArNTU4OTAsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NjM6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5Njk6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5Njc6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk2ODoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5NzM6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk3NDoxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5Njg6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTY5OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTc0OjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk3NToyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTU4ODUsMTQgKzU1OTMxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTc4OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xIDogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk4NDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMSA6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5ODI6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5ODM6MjogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk4ODoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk4OToyOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMV9fSW1wbCgpOwpAQCAtNTU5MTgsMjMgKzU1OTY0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTg5OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xX19JbXBsIDogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5OTU6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF8xXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjk5MzoxOiAoICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5OTQ6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5OTk6MTogKCAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDAwOjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTk0OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTk1OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMDA6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMDE6MjogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2OTk2OjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY5OTY6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDAyOjI6ICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMDI6MzogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMV8xKCk7CkBAIC01NTk2OSwxNCArNTYwMTUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDA1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAxMToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDA5OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMTA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDE1OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMTY6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDgpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsKCk7CkBAIC01NjAwNywyMyArNTYwNTMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDE3OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAyMzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDIxOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMjI6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDI3OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMjg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDIyOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAyMzoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAyODoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMjk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMjQ6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMjQ6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAzMDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAzMDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMCgpOwpAQCAtNTYwNTgsMTQgKzU2MTA0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAzMjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzAzODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwMzY6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDM3OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDQyOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA0MzoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01NjA5MSwyNyArNTYxMzcsMjcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDQzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNDk6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNDc6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNDg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1MzoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1NDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDQ4OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNDk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDU0OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNTU6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDUwOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1NjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0MTM2PTI7CiAgICAgICAgICAgICBhbHQxMzYgPSBkZmExMzYucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1MDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMAorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNTY6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAoKTsKQEAgLTU2MTQ5LDE0ICs1NjE5NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1OToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNjU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDYzOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDY0OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNjk6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNzA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wX19JbXBsKCk7CkBAIC01NjE4NywyMyArNTYyMzMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNzE6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzBfX0ltcGwgOiAoICggJzwnICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDc3OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wX19JbXBsIDogKCAoICc8JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA3NToxOiAoICggKCAnPCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA3NjoxOiAoICggJzwnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDgxOjE6ICggKCAoICc8JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDgyOjE6ICggKCAnPCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNzY6MTogKCAoICc8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA3NzoyOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwODI6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA4MzoyOiAoICc8JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDc4OjI6ICggJzwnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA3ODozOiAnPCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA4NDoyOiAoICc8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwODQ6MzogJzwnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBtYXRjaChpbnB1dCwyNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAKQEAgLTU2MjM0LDE0ICs1NjI4MCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA4NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMSA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwOTI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDkwOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MDkxOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwOTY6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwOTc6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xX19JbXBsKCk7CkBAIC01NjI3MiwyMyArNTYzMTgsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwOTg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTA0OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEwMjoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEwMzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTA4OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTA5OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMDM6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEwNDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMDk6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzExMDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTA1OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEwNTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzExMToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMTE6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpOwpAQCAtNTYzMjMsMTQgKzU2MzY5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTEzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzExOToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMiA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMTc6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMTg6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEyMzoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEyNDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMwogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzkpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzJfX0ltcGwoKTsKQEAgLTU2MzYxLDM1ICs1NjQwNywzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEyNToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEzMToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEyOToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTMwOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEzNToxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTM2OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEzMDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMzE6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMzY6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTM3OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMzI6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxMzg6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wICkqCiAgICAgICAgICAgICBsb29wMTM3OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMzc9MjsKICAgICAgICAgICAgICAgICBpbnQgTEExMzdfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExMzdfMD09ODApICkgeworICAgICAgICAgICAgICAgIGlmICggKExBMTM3XzA9PTgxKSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0MTM3PTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEzMjozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzEzODozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wKCk7CkBAIC01NjQzMCwxNCArNTY0NzYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxNDA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzMgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fM19fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTQ2OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE0NDoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE0NToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fM19fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTUwOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTUxOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzNfX0ltcGwoKTsKQEAgLTU2NDY4LDE3ICs1NjUxNCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE1MjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fM19fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE1ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fM19fSW1wbCA6ICggJz4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18zX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE1NjoxOiAoICggJz4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTU3OjE6ICggJz4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE2MjoxOiAoICggJz4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTYzOjE6ICggJz4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE1NzoxOiAoICc+JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxNTg6MjogJz4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxNjM6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTY0OjI6ICc+JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV8zKCkpOyAKQEAgLTU2NTA5LDE0ICs1NjU1NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE2NzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180X19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxNzM6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTcxOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzRfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTcyOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180X19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxNzc6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxNzg6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzRfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzRfX0ltcGwoKTsKQEAgLTU2NTQyLDIyICs1NjU4OCwyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180X19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE3ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE4NDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fNF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX180X19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE4MjoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTgzOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE4ODoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTg5OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE4MzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxODQ6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxODk6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTkwOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxODU6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxOTE6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wICkqCiAgICAgICAgICAgICBsb29wMTM4OgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMzg9MjsKQEAgLTU2NTY5LDcgKzU2NjE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMzhfMj09UlVMRV9JRCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMzhfMyA9IGlucHV0LkxBKDMpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTg2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTg3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM4PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU2NTgyLDcgKzU2NjI4LDcgQEAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM4KSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTg1OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTkxOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMjApOwogICAgICAgICAgICAgCSAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wKCk7CkBAIC01NjYyMywxNCArNTY2NjksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE5NDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMDA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxOTg6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTk5OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjA0OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIwNToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwoKTsKQEAgLTU2NjYxLDIyICs1NjcwNywyMiBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjA2OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMTI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMF9fSW1wbCA6ICggJywnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjEwOjE6ICggKCAnLCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMTE6MTogKCAnLCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjE2OjE6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMTc6MTogKCAnLCcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjExOjE6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIxMjoyOiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIxNzoxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMTg6MjogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01NjcwMiwxNCArNTY3NDgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIyMToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjI3OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIyNToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjI2OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIzMToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjMyOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzJfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCgpOwpAQCAtNTY3MzUsMjMgKzU2NzgxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMzI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIzODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMzY6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIzNzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNDI6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI0MzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyMzc6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjM4OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjQzOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI0NDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIzOToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzIzOTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjQ1OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjQ1OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCk7CkBAIC01Njc4NiwxNCArNTY4MzIsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI0ODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNTQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNTI6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjUzOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjU4OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI1OToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzcpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCgpOwpAQCAtNTY4MjQsMjMgKzU2ODcwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNjA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNjY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI2NDoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI2NToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjcwOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjcxOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNjU6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI2NjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNzE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI3MjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjY3OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI2NzozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI3MzoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNzM6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCgpOwpAQCAtNTY4NzUsMTQgKzU2OTIxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyNzU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMSA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjgxOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mjc5OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI4MDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI4NToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyODY6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV180OCk7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsKCk7CkBAIC01NjkxMywyMyArNTY5NTksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI4NzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI5MzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjkxOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjkyOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyOTc6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyOTg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI5MjoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MjkzOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzI5ODoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mjk5OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcyOTQ6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mjk0OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzAwOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMwMDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fVHlwZUFzc2lnbm1lbnRfMV80XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xKCk7CkBAIC01Njk2NCwxNCArNTcwMTAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMwMjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMl9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzA4OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzIgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMwNjoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzA3OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMxMjoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzEzOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMl9fSW1wbCgpOwpAQCAtNTY5OTcsMjcgKzU3MDQzLDI3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMl9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMTM6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzE5OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzE3OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMxODoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyMzoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMjQ6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMTg6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMTk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyNDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyNToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyMDoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzI2OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wICk/CiAgICAgICAgICAgICBpbnQgYWx0MTM5PTI7CiAgICAgICAgICAgICBhbHQxMzkgPSBkZmExMzkucHJlZGljdChpbnB1dCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzOSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyMDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzI2OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAoKTsKQEAgLTU3MDU1LDE0ICs1NzEwMSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMjk6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMzU6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzMzOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMzNDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMzOToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMF9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNDA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMF9fSW1wbCgpOwpAQCAtNTcwODgsMjMgKzU3MTM0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM0MDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzBfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNDY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM0NDoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzQ1OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM1MDoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzUxOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM0NToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNDY6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNTE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzUyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzQ3OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzQ3OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNTM6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNTM6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAoKTsKQEAgLTU3MTM5LDE0ICs1NzE4NSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM1NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNjI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzYwOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzYxOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNjY6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNjc6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMF9fSW1wbCgpOwpAQCAtNTcxNzcsMjMgKzU3MjIzLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzY4OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wX19JbXBsIDogKCAoKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNzQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM3MjoxOiAoICggKCkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNzM6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNzg6MTogKCAoICgpICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mzc5OjE6ICggKCkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzczOjE6ICggKCkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mzc0OjI6ICgpCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNzk6MTogKCAoKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczODA6MjogKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1Jbm5lclR5cGVSZWZlcmVuY2VPdXRlckFjdGlvbl8xXzRfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mzc1OjI6ICgpCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczNzU6MzogCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczODE6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM4MTozOiAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH0KIApAQCAtNTcyMTgsMTQgKzU3MjY0LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MzgzOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM4OToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczODc6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczODg6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM5MzoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzM5NDoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMV9fSW1wbCgpOwpAQCAtNTcyNTEsMTcgKzU3Mjk3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mzk0OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xX19JbXBsIDogKCAnLicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDAwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18xX19JbXBsIDogKCAnLicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8wXzBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mzk4OjE6ICggKCAnLicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczOTk6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDA0OjE6ICggKCAnLicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0MDU6MTogKCAnLicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Mzk5OjE6ICggJy4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQwMDoyOiAnLicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQwNToxOiAoICcuJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0MDY6MjogJy4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfNF8wXzBfMSgpKTsgCkBAIC01NzI5MiwxNCArNTczMzgsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDEwOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQxNjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDE0OjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0MTU6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDIwOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0MjE6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsKCk7CkBAIC01NzMzMCwyMyArNTczNzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDIyOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMF9fSW1wbCA6ICggKCAnPCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0Mjg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wX19JbXBsIDogKCAoICc8JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0MjY6MTogKCAoICggJzwnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0Mjc6MTogKCAoICc8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQzMjoxOiAoICggKCAnPCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQzMzoxOiAoICggJzwnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDI3OjE6ICggKCAnPCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0Mjg6MjogKCAnPCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDMzOjE6ICggKCAnPCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0MzQ6MjogKCAnPCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV80XzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0Mjk6MjogKCAnPCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDI5OjM6ICc8JworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDM1OjI6ICggJzwnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQzNTozOiAnPCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIG1hdGNoKGlucHV0LDI3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKIApAQCAtNTczNzcsMTQgKzU3NDIzLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQzNzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzEgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0NDM6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ0MToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDQyOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ0NzoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDQ4OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCgpOwpAQCAtNTc0MTUsMjMgKzU3NDYxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ0OToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ1NToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0NTM6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDU0OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDU5OjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ2MDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ1NDoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ1NToyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDYwOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDYxOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ1NjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDU2OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ2MjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDYyOjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSgpOwpAQCAtNTc0NjYsMTQgKzU3NTEyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ2NDoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzIgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0NzA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMyA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ2ODoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDY5OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ3NDoxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDc1OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc5KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCgpOwpAQCAtNTc1MDQsMzUgKzU3NTUwLDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ3NjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDgyOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMl9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDgwOjE6ICggKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDgxOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0ODY6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0ODc6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ4MToxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDgyOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ4NzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDg4OjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xXzRfMl8yKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ4MzoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0ODk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCApKgogICAgICAgICAgICAgbG9vcDE0MDoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTQwPTI7CiAgICAgICAgICAgICAgICAgaW50IExBMTQwXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTQwXzA9PTgwKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE0MF8wPT04MSkgKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsdDE0MD0xOwogICAgICAgICAgICAgICAgIH0KIAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDApIHsKICAgICAgICAgICAgIAljYXNlIDEgOgotICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0ODM6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAKKyAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDg5OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfNDApOwogICAgICAgICAgICAgCSAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCgpOwpAQCAtNTc1NzMsMTQgKzU3NjE5LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ5MToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzQ5NzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzMgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc0OTU6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NDk2OjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fM19fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTAxOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzUwMjoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18zX19JbXBsKCk7CkBAIC01NzYwNiwxNyArNTc2NTIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTAyOjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fM19fSW1wbCA6ICggJz4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzUwODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwgOiAoICc+JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzNfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTA2OjE6ICggKCAnPicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MDc6MTogKCAnPicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTEyOjE6ICggKCAnPicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MTM6MTogKCAnPicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTA3OjE6ICggJz4nICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzUwODoyOiAnPicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzUxMzoxOiAoICc+JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MTQ6MjogJz4nCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzRfMl8zKCkpOyAKQEAgLTU3NjQ3LDE0ICs1NzY5MywxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzUxODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MjQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAgOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTIyOjE6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTIzOjI6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1Mjg6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMF9fSW1wbCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1Mjk6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzBfX0ltcGwgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzc4KTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wX19JbXBsKCk7CkBAIC01NzY4NSwyMiArNTc3MzEsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MzA6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MzY6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzBfX0ltcGwgOiAoICcsJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MzQ6MTogKCAoICcsJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzUzNToxOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NDA6MTogKCAoICcsJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU0MToxOiAoICcsJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1MzU6MTogKCAnLCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTM2OjI6ICcsJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTQxOjE6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU0MjoyOiAnLCcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV80XzJfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzRfMl8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNTc3MjYsMTQgKzU3NzcyLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTQ1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xIDogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU1MToxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMSA6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NDk6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NTA6MjogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU1NToxOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU1NjoyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCgpOwpAQCAtNTc3NTksMjMgKzU3ODA1LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yXzJfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTU2OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU2MjoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NjA6MTogKCAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NjE6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU2NjoxOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU2NzoxOiAoICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTYxOjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NjI6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTY3OjE6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1Njg6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU2MzoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1NjM6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1Njk6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTY5OjM6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEoKTsKQEAgLTU3ODEwLDE0ICs1Nzg1NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTcyOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU3ODoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wIDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU3NjoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1Nzc6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1ODI6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTgzOjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNzgpOwogICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTc4NDgsMjMgKzU3ODk0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1ODQ6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbCA6ICggKCkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTkwOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwgOiAoICgpICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTg4OjE6ICggKCAoKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU4OToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU5NDoxOiAoICggKCkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1OTU6MTogKCAoKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1ODk6MTogKCAoKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1OTA6MjogKCkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU5NToxOiAoICgpICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU5NjoyOiAoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY3Rpb25fMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc1OTE6MjogKCkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU5MTozOiAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU5NzoyOiAoKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NTk3OjM6IAogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCkBAIC01Nzg4OSwxNCArNTc5MzUsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzU5OToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xIDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2MDU6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMiA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2MDM6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjA0OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjA5OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMV9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzYxMDoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyMyk7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01NzkyNywyMiArNTc5NzMsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzYxMToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsIDogKCAnPycgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjE3OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwgOiAoICc/JyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzYxNToxOiAoICggJz8nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjE2OjE6ICggJz8nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzYyMToxOiAoICggJz8nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjIyOjE6ICggJz8nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzYxNjoxOiAoICc/JyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2MTc6MjogJz8nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2MjI6MTogKCAnPycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjIzOjI6ICc/JwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtLZXl3b3JkXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTAzLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrS2V5d29yZF8xKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU3OTY4LDE0ICs1ODAxNCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjI2OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2MzI6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMiA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjMwOjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2MzE6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjM2OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2Mzc6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsKCk7CkBAIC01ODAwMSwyMiArNTgwNDcsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzYzNzoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgKT8gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjQzOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiApPyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18yX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY0MToxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjQyOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY0NzoxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjQ4OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY0MjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NDM6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NDg6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjQ5OjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NDQ6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NTA6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yICk/CiAgICAgICAgICAgICBpbnQgYWx0MTQxPTI7CiAgICAgICAgICAgICBpbnQgTEExNDFfMCA9IGlucHV0LkxBKDEpOwogCkBAIC01ODAyNSw3ICs1ODA3MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY0NDozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY1MDozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIoKTsKQEAgLTU4MDYzLDE0ICs1ODEwOSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY1MzoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NTk6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjU3OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjU4OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NjM6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NjQ6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNCk7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMF9fSW1wbCgpOwpAQCAtNTgxMDEsMjMgKzU4MTQ3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzBfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjY1OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjcxOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wX19JbXBsIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjY5OjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NzA6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Njc1OjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NzY6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjcwOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY3MToyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY3NjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2Nzc6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NzI6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2NzI6MzogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY3ODoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY3ODozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCgpOwpAQCAtNTgxNTIsMTQgKzU4MTk4LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjgwOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xIDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzFfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY4NjoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2ODQ6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2ODU6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY5MDoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY5MToyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCgpOwpAQCAtNTgxODUsMzUgKzU4MjMxLDM1IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzFfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NjkxOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xICkqICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzY5NzoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2OTU6MTogKCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgKSogKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2OTY6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcwMToxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcwMjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgKSogKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Njk2OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc2OTc6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzAyOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3MDM6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Njk4OjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcwNDoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xICkqCiAgICAgICAgICAgICBsb29wMTQyOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxNDI9MjsKICAgICAgICAgICAgICAgICBpbnQgTEExNDJfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICAgICAgaWYgKCAoTEExNDJfMD09MTA0KSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE0Ml8wPT0xMDUpICkgewogICAgICAgICAgICAgICAgICAgICBhbHQxNDI9MTsKICAgICAgICAgICAgICAgICB9CiAKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQyKSB7CiAgICAgICAgICAgICAJY2FzZSAxIDoKLSAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Njk4OjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcwNDozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMQogICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XXzEyNSk7CiAgICAgICAgICAgICAJICAgIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xKCk7CkBAIC01ODI1NCwxNCArNTgzMDAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3MDc6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzEzOjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wIDogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcxMToxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcxMjoyOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzE3OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzBfX0ltcGwgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzE4OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wX19JbXBsIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjQpOwogICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzBfX0ltcGwoKTsKQEAgLTU4MjkyLDIzICs1ODMzOCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcxOToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcyNToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMF9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcyMzoxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzI0OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcyOToxOiAoICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzMwOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzcyNDoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3MjU6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3MzA6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzMxOjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzI2OjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzI2OjM6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8wCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3MzI6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3MzI6MzogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAoKTsKQEAgLTU4MzQzLDE0ICs1ODM4OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzczNDoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMSA6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NDA6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEgOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzM4OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzM5OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NDQ6MTogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NDU6MjogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwoKTsKQEAgLTU4Mzc2LDM1ICs1ODQyMiwzNSBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc0NToxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSApKiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NTE6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzQ5OjE6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xICkqICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzUwOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSApKiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NTU6MTogKCAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NTY6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xICkqICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc1MDoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzUxOjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc1NjoxOiAoICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzU3OjI6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgKSoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc1MjoyOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NTg6MjogKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSApKgogICAgICAgICAgICAgbG9vcDE0MzoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0MTQzPTI7CiAgICAgICAgICAgICAgICAgaW50IExBMTQzXzAgPSBpbnB1dC5MQSgxKTsKIAotICAgICAgICAgICAgICAgIGlmICggKExBMTQzXzA9PTEwNCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoTEExNDNfMD09MTA1KSApIHsKICAgICAgICAgICAgICAgICAgICAgYWx0MTQzPTE7CiAgICAgICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc1MjozOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NTg6MzogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV18xMjUpOwogICAgICAgICAgICAgCSAgICBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSgpOwpAQCAtNTg0NDUsMTQgKzU4NDkxLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3NzYxOjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIDogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc2NzoxOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCA6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NjU6MTogKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3NjY6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc3MToxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc3MjoyOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTU4NDgzLDE3ICs1ODUyOSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc3MzoxOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMF9fSW1wbCA6ICggJ2V4dGVuZHMnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc3OToxOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMF9fSW1wbCA6ICggJ2V4dGVuZHMnICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc3NzoxOiAoICggJ2V4dGVuZHMnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Nzc4OjE6ICggJ2V4dGVuZHMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc4MzoxOiAoICggJ2V4dGVuZHMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Nzg0OjE6ICggJ2V4dGVuZHMnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc3ODoxOiAoICdleHRlbmRzJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3Nzk6MjogJ2V4dGVuZHMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3ODQ6MTogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Nzg1OjI6ICdleHRlbmRzJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMCgpKTsgCkBAIC01ODUyNCwxNCArNTg1NzAsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3ODg6MTogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzEgOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Nzk0OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xIDogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc5MjoxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xX19JbXBsICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzc5MzoyOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Nzk4OjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3Nzk5OjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xX19JbXBsCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01ODU1NywyMyArNTg2MDMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc3OTk6MTogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgwNToxOiBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODAzOjE6ICggKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgwNDoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgwOToxOiAoICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MTA6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MDQ6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MDU6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgxMDoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgxMToyOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MDY6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgwNjozOiBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MTI6MjogKCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgxMjozOiBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKTsKQEAgLTU4NjA4LDE0ICs1ODY1NCwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODE1OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgyMToxOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wIDogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgxOToxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MjA6MjogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MjU6MTogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODI2OjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpOwpAQCAtNTg2NDYsMjIgKzU4NjkyLDIyIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4Mjc6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCA6ICggJyYnICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgzMzoxOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIDogKCAnJicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MzE6MTogKCAoICcmJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgzMjoxOiAoICcmJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4Mzc6MTogKCAoICcmJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgzODoxOiAoICcmJyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4MzI6MTogKCAnJicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODMzOjI6ICcmJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODM4OjE6ICggJyYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzgzOToyOiAnJicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0QW1wZXJzYW5kS2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNCxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDUsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC01ODY4NywxNCArNTg3MzMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg0MjoxOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xIDogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODQ4OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzEgOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg0NjoxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODQ3OjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg1MjoxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODUzOjI6IHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCgpOwpAQCAtNTg3MjAsMjMgKzU4NzY2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NTM6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NTk6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg1NzoxOiAoICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg1ODoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODYzOjE6ICggKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODY0OjE6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NTg6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg1OToyOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NjQ6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg2NToyOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODYwOjI6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg2MDozOiBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg2NjoyOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NjY6MzogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgICAgIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpOwpAQCAtNTg3NzEsMTQgKzU4ODE3LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODY5OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wIDogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzEgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg3NToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NzM6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4NzQ6MjogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg3OToxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg4MDoyOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMQogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfNTgpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTU4ODA5LDE3ICs1ODg1NSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg4MToxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMF9fSW1wbCA6ICggJ3N1cGVyJyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4ODc6MTogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwgOiAoICdzdXBlcicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODg1OjE6ICggKCAnc3VwZXInICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODg2OjE6ICggJ3N1cGVyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4OTE6MTogKCAoICdzdXBlcicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc4OTI6MTogKCAnc3VwZXInICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg4NjoxOiAoICdzdXBlcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODg3OjI6ICdzdXBlcicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg5MjoxOiAoICdzdXBlcicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3ODkzOjI6ICdzdXBlcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8wKCkpOyAKQEAgLTU4ODUwLDE0ICs1ODg5NiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzg5NjoxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMSA6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5MDI6MTogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzEgOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMV9fSW1wbCA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTAwOjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTAxOjI6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xX19JbXBsCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5MDY6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5MDc6MjogcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTU4ODgzLDIzICs1ODkyOSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkwNzoxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMV9fSW1wbCA6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTEzOjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMV9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5MTE6MTogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTEyOjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTE3OjE6ICggKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkxODoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkxMjoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkxMzoyOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTE4OjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTE5OjI6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkxNDoyOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTE0OjM6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkyMDoyOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTIwOjM6IHJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpOwpAQCAtNTg5MzQsMTQgKzU4OTgwLDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5MjM6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCA6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTI5OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTI3OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkyODoyOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkzMzoxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5MzQ6MjogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9fSW1wbCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV181OCk7CiAgICAgICAgICAgICBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsKCk7CkBAIC01ODk3MiwyMiArNTkwMTgsMjIgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkzNToxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsIDogKCAnJicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTQxOjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzBfX0ltcGwgOiAoICcmJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzkzOToxOiAoICggJyYnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTQwOjE6ICggJyYnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk0NToxOiAoICggJyYnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTQ2OjE6ICggJyYnICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk0MDoxOiAoICcmJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NDE6MjogJyYnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NDY6MTogKCAnJicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTQ3OjI6ICcmJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRLZXl3b3JkXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA0LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0QW1wZXJzYW5kS2V5d29yZF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTU5MDEzLDE0ICs1OTA1OSwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTUwOjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEgOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NTY6MTogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMSA6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTU0OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NTU6MjogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTYwOjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NjE6MjogcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01OTA0NiwyMyArNTkwOTIsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk2MToxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk2NzoxOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18xX19JbXBsIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzFfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTY1OjE6ICggKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTY2OjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NzE6MTogKCAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5NzI6MTogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk2NjoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTY3OjI6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk3MjoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTczOjI6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5Njg6MjogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTY4OjM6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTc0OjI6ICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk3NDozOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICAgICAgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCk7CkBAIC01OTA5NywxNCArNTkxNDMsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5Nzc6MTogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTgzOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzEgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk4MToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk4MjoyOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTg3OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzEgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTg4OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMTkpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzBfX0ltcGwoKTsKQEAgLTU5MTM1LDE3ICs1OTE4MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk4OToxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVF1YWxpZmllZE5hbWUgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTk1OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wX19JbXBsIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTc5OTM6MTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTk0OjE6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3OTk5OjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAwMDoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk5NDoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzk5NToyOiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDAwOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDAxOjI6IHJ1bGVRdWFsaWZpZWROYW1lCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgCkBAIC01OTE4MCwxNCArNTkyMjYsMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwMDQ6MTogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMV9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMiA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDEwOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xIDogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzIgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAwODoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAwOToyOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMV9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDE0OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzFfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDE1OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV18xMjYpOwogICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzFfX0ltcGwoKTsKQEAgLTU5MjE4LDE3ICs1OTI2NCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAxNjoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMV9fSW1wbCA6ICggJy4nICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAyMjoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMV9fSW1wbCA6ICggJy4nICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAyMDoxOiAoICggJy4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDIxOjE6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAyNjoxOiAoICggJy4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDI3OjE6ICggJy4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAyMToxOiAoICcuJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwMjI6MjogJy4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwMjc6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDI4OjI6ICcuJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzEoKSk7IApAQCAtNTkyNTksMTQgKzU5MzA1LDE0IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDMxOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yIDogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzJfX0ltcGwgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODAzNzoxOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMiA6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwMzU6MTogKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMl9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwMzY6MjogcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzJfX0ltcGwKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA0MToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA0MjoyOiBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMl9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMl9fSW1wbCgpOwpAQCAtNTkyOTIsMTcgKzU5MzM4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzJfX0ltcGwiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDQyOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsIDogKCAnKicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDQ4OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18yX19JbXBsIDogKCAnKicgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzJfX0ltcGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDQ2OjE6ICggKCAnKicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNDc6MTogKCAnKicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDUyOjE6ICggKCAnKicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNTM6MTogKCAnKicgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDQ3OjE6ICggJyonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA0ODoyOiAnKicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA1MzoxOiAoICcqJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNTQ6MjogJyonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMigpKTsgCkBAIC01OTMzMywxNCArNTkzNzksMTQgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA1ODoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wIDogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNjQ6MTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCA6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNjI6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDYzOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfX0ltcGwgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDY4OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA2OToyOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzExOSk7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsKCk7CkBAIC01OTM3MSwxNyArNTk0MTcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA3MDoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX19JbXBsIDogKCBydWxlVmFsaWRJRCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNzY6MTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCA6ICggcnVsZVZhbGlkSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMF9fSW1wbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwNzQ6MTogKCAoIHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDc1OjE6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDgwOjE6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA4MToxOiAoIHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA3NToxOiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA3NjoyOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDgxOjE6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDgyOjI6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKQEAgLTU5NDE2LDE0ICs1OTQ2MiwxNCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDg1OjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEgOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwOTE6MTogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMSA6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzFfX0ltcGwgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDg5OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwOTA6MjogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MDk1OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgwOTY6MjogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMV9fSW1wbAogICAgICAgICAgICAgewogICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsKCk7CkBAIC01OTQ0OSwxNyArNTk0OTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODA5NjoxOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsIDogKCAnLicgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTAyOjE6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzFfX0ltcGwgOiAoICcuJyApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18xX19JbXBsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEwMDoxOiAoICggJy4nICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTAxOjE6ICggJy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEwNjoxOiAoICggJy4nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTA3OjE6ICggJy4nICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEwMToxOiAoICcuJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMDI6MjogJy4nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMDc6MTogKCAnLicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTA4OjI6ICcuJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMSgpKTsgCkBAIC01OTQ5MCwxNyArNTk1MzYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODExMjoxOiBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wIDogKCBydWxlWEltcG9ydFNlY3Rpb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTE4OjE6IHJ1bGVfX1N0cmF0ZWd5TW9kZWxfX0ltcG9ydFNlY3Rpb25Bc3NpZ25tZW50XzAgOiAoIHJ1bGVYSW1wb3J0U2VjdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneU1vZGVsX19JbXBvcnRTZWN0aW9uQXNzaWdubWVudF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODExNjoxOiAoICggcnVsZVhJbXBvcnRTZWN0aW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTE3OjI6ICggcnVsZVhJbXBvcnRTZWN0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEyMjoxOiAoICggcnVsZVhJbXBvcnRTZWN0aW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTIzOjI6ICggcnVsZVhJbXBvcnRTZWN0aW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODExNzoyOiAoIHJ1bGVYSW1wb3J0U2VjdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMTg6MzogcnVsZVhJbXBvcnRTZWN0aW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMjM6MjogKCBydWxlWEltcG9ydFNlY3Rpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTI0OjM6IHJ1bGVYSW1wb3J0U2VjdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneU1vZGVsQWNjZXNzKCkuZ2V0SW1wb3J0U2VjdGlvblhJbXBvcnRTZWN0aW9uUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKQEAgLTU5NTM1LDE3ICs1OTU4MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEyNzoxOiBydWxlX19TdHJhdGVneU1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfMSA6ICggcnVsZVN0cmF0ZWd5UGFja2FnZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMzM6MTogcnVsZV9fU3RyYXRlZ3lNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEgOiAoIHJ1bGVTdHJhdGVneVBhY2thZ2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTMxOjE6ICggKCBydWxlU3RyYXRlZ3lQYWNrYWdlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTMyOjI6ICggcnVsZVN0cmF0ZWd5UGFja2FnZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMzc6MTogKCAoIHJ1bGVTdHJhdGVneVBhY2thZ2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxMzg6MjogKCBydWxlU3RyYXRlZ3lQYWNrYWdlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEzMjoyOiAoIHJ1bGVTdHJhdGVneVBhY2thZ2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTMzOjM6IHJ1bGVTdHJhdGVneVBhY2thZ2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODEzODoyOiAoIHJ1bGVTdHJhdGVneVBhY2thZ2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTM5OjM6IHJ1bGVTdHJhdGVneVBhY2thZ2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzU3RyYXRlZ3lQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTU5NTgwLDE3ICs1OTYyNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNDI6MTogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNDg6MTogcnVsZV9fU3RyYXRlZ3lQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTQ2OjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE0NzoyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE1MjoxOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNTM6MjogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNDc6MjogKCBydWxlUXVhbGlmaWVkTmFtZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNDg6MzogcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE1MzoyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE1NDozOiBydWxlUXVhbGlmaWVkTmFtZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneVBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCkBAIC01OTYyNSwxNyArNTk2NzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTU3OjE6IHJ1bGVfX1N0cmF0ZWd5UGFja2FnZV9fU3RyYXRlZ3lBc3NpZ25tZW50XzNfMSA6ICggcnVsZVN0cmF0ZWd5ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE2MzoxOiBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEgOiAoIHJ1bGVTdHJhdGVneSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVBhY2thZ2VfX1N0cmF0ZWd5QXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTYxOjE6ICggKCBydWxlU3RyYXRlZ3kgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNjI6MjogKCBydWxlU3RyYXRlZ3kgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTY3OjE6ICggKCBydWxlU3RyYXRlZ3kgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNjg6MjogKCBydWxlU3RyYXRlZ3kgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTYyOjI6ICggcnVsZVN0cmF0ZWd5ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE2MzozOiBydWxlU3RyYXRlZ3kKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE2ODoyOiAoIHJ1bGVTdHJhdGVneSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNjk6MzogcnVsZVN0cmF0ZWd5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5UGFja2FnZUFjY2VzcygpLmdldFN0cmF0ZWd5U3RyYXRlZ3lQYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCkBAIC01OTY3MCwxNyArNTk3MTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNzI6MTogcnVsZV9fU3RyYXRlZ3lfX1RhcmdldHNBc3NpZ25tZW50XzMgOiAoIHJ1bGVTdHJhdGVneVRhcmdldCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNzg6MTogcnVsZV9fU3RyYXRlZ3lfX1RhcmdldHNBc3NpZ25tZW50XzMgOiAoIHJ1bGVTdHJhdGVneVRhcmdldCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneV9fVGFyZ2V0c0Fzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNzY6MTogKCAoIHJ1bGVTdHJhdGVneVRhcmdldCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE3NzoyOiAoIHJ1bGVTdHJhdGVneVRhcmdldCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxODI6MTogKCAoIHJ1bGVTdHJhdGVneVRhcmdldCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE4MzoyOiAoIHJ1bGVTdHJhdGVneVRhcmdldCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxNzc6MjogKCBydWxlU3RyYXRlZ3lUYXJnZXQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTc4OjM6IHJ1bGVTdHJhdGVneVRhcmdldAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTgzOjI6ICggcnVsZVN0cmF0ZWd5VGFyZ2V0ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE4NDozOiBydWxlU3RyYXRlZ3lUYXJnZXQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lBY2Nlc3MoKS5nZXRUYXJnZXRzU3RyYXRlZ3lUYXJnZXRQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IApAQCAtNTk3MTUsMTcgKzU5NzYxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxODc6MTogcnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCA6ICggcnVsZVN0cmF0ZWd5RGVmYXVsdCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxOTM6MTogcnVsZV9fU3RyYXRlZ3lfX1N0cmF0ZWd5RGVmYXVsdEFzc2lnbm1lbnRfNCA6ICggcnVsZVN0cmF0ZWd5RGVmYXVsdCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneV9fU3RyYXRlZ3lEZWZhdWx0QXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE5MToxOiAoICggcnVsZVN0cmF0ZWd5RGVmYXVsdCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE5MjoyOiAoIHJ1bGVTdHJhdGVneURlZmF1bHQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTk3OjE6ICggKCBydWxlU3RyYXRlZ3lEZWZhdWx0ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MTk4OjI6ICggcnVsZVN0cmF0ZWd5RGVmYXVsdCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxOTI6MjogKCBydWxlU3RyYXRlZ3lEZWZhdWx0ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE5MzozOiBydWxlU3RyYXRlZ3lEZWZhdWx0CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgxOTg6MjogKCBydWxlU3RyYXRlZ3lEZWZhdWx0ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODE5OTozOiBydWxlU3RyYXRlZ3lEZWZhdWx0CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5QWNjZXNzKCkuZ2V0U3RyYXRlZ3lEZWZhdWx0U3RyYXRlZ3lEZWZhdWx0UGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTU5NzYwLDE3ICs1OTgwNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19MYXlvdXRpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjAyOjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19MYXlvdXRpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzEgOiAoIHJ1bGVMYXlvdXRpbmdTdHJhdGVneSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyMDg6MTogcnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0xheW91dGluZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMSA6ICggcnVsZUxheW91dGluZ1N0cmF0ZWd5ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19MYXlvdXRpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjA2OjE6ICggKCBydWxlTGF5b3V0aW5nU3RyYXRlZ3kgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyMDc6MjogKCBydWxlTGF5b3V0aW5nU3RyYXRlZ3kgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjEyOjE6ICggKCBydWxlTGF5b3V0aW5nU3RyYXRlZ3kgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyMTM6MjogKCBydWxlTGF5b3V0aW5nU3RyYXRlZ3kgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjA3OjI6ICggcnVsZUxheW91dGluZ1N0cmF0ZWd5ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIwODozOiBydWxlTGF5b3V0aW5nU3RyYXRlZ3kKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIxMzoyOiAoIHJ1bGVMYXlvdXRpbmdTdHJhdGVneSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyMTQ6MzogcnVsZUxheW91dGluZ1N0cmF0ZWd5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5VGFyZ2V0QWNjZXNzKCkuZ2V0TGF5b3V0aW5nU3RyYXRlZ2llc0xheW91dGluZ1N0cmF0ZWd5UGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IApAQCAtNTk4MDUsMTcgKzU5ODUxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lUYXJnZXRfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfMl8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIxNzoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzIgOiAoIHJ1bGVGb2N1c2luZ1N0cmF0ZWd5ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIyMzoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF8yXzIgOiAoIHJ1bGVGb2N1c2luZ1N0cmF0ZWd5ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzJfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyMjE6MTogKCAoIHJ1bGVGb2N1c2luZ1N0cmF0ZWd5ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjIyOjI6ICggcnVsZUZvY3VzaW5nU3RyYXRlZ3kgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjI3OjE6ICggKCBydWxlRm9jdXNpbmdTdHJhdGVneSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIyODoyOiAoIHJ1bGVGb2N1c2luZ1N0cmF0ZWd5ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIyMjoyOiAoIHJ1bGVGb2N1c2luZ1N0cmF0ZWd5ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIyMzozOiBydWxlRm9jdXNpbmdTdHJhdGVneQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjI4OjI6ICggcnVsZUZvY3VzaW5nU3RyYXRlZ3kgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjI5OjM6IHJ1bGVGb2N1c2luZ1N0cmF0ZWd5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5VGFyZ2V0QWNjZXNzKCkuZ2V0Rm9jdXNpbmdTdHJhdGVnaWVzRm9jdXNpbmdTdHJhdGVneVBhcnNlclJ1bGVDYWxsXzJfMl8wKCkpOyAKQEAgLTU5ODUwLDE3ICs1OTg5NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ0VuaGFuY2VyQXNzaWdubWVudF8yXzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjMyOjE6IHJ1bGVfX1N0cmF0ZWd5VGFyZ2V0X19Gb2N1c2luZ0VuaGFuY2VyQXNzaWdubWVudF8yXzMgOiAoIHJ1bGVGb2N1c2luZ0VuaGFuY2VyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIzODoxOiBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zIDogKCBydWxlRm9jdXNpbmdFbmhhbmNlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19TdHJhdGVneVRhcmdldF9fRm9jdXNpbmdFbmhhbmNlckFzc2lnbm1lbnRfMl8zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODIzNjoxOiAoICggcnVsZUZvY3VzaW5nRW5oYW5jZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyMzc6MjogKCBydWxlRm9jdXNpbmdFbmhhbmNlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNDI6MTogKCAoIHJ1bGVGb2N1c2luZ0VuaGFuY2VyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjQzOjI6ICggcnVsZUZvY3VzaW5nRW5oYW5jZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjM3OjI6ICggcnVsZUZvY3VzaW5nRW5oYW5jZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjM4OjM6IHJ1bGVGb2N1c2luZ0VuaGFuY2VyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNDM6MjogKCBydWxlRm9jdXNpbmdFbmhhbmNlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNDQ6MzogcnVsZUZvY3VzaW5nRW5oYW5jZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lUYXJnZXRBY2Nlc3MoKS5nZXRGb2N1c2luZ0VuaGFuY2VyRm9jdXNpbmdFbmhhbmNlclBhcnNlclJ1bGVDYWxsXzJfM18wKCkpOyAKQEAgLTU5ODk1LDE3ICs1OTk0MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0xheW91dGluZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI0NzoxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiA6ICggUlVMRV9JRCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNTM6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIgOiAoIFJVTEVfSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX05hbWVBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjUxOjE6ICggKCBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjUyOjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNTc6MTogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNTg6MjogKCBSVUxFX0lEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI1MjoyOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjUzOjM6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI1ODoyOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjU5OjM6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCkBAIC01OTkzNiwxNyArNTk5ODIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTGF5b3V0QXNzaWdubWVudF80IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI2MjoxOiBydWxlX19MYXlvdXRpbmdTdHJhdGVneV9fTGF5b3V0QXNzaWdubWVudF80IDogKCBydWxlTGF5b3V0aW5nRW51bSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNjg6MTogcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0xheW91dEFzc2lnbm1lbnRfNCA6ICggcnVsZUxheW91dGluZ0VudW0gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fTGF5b3V0aW5nU3RyYXRlZ3lfX0xheW91dEFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNjY6MTogKCAoIHJ1bGVMYXlvdXRpbmdFbnVtICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjY3OjI6ICggcnVsZUxheW91dGluZ0VudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjcyOjE6ICggKCBydWxlTGF5b3V0aW5nRW51bSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI3MzoyOiAoIHJ1bGVMYXlvdXRpbmdFbnVtICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI2NzoyOiAoIHJ1bGVMYXlvdXRpbmdFbnVtICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI2ODozOiBydWxlTGF5b3V0aW5nRW51bQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MjczOjI6ICggcnVsZUxheW91dGluZ0VudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mjc0OjM6IHJ1bGVMYXlvdXRpbmdFbnVtCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExheW91dGluZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0TGF5b3V0TGF5b3V0aW5nRW51bUVudW1SdWxlQ2FsbF80XzAoKSk7IApAQCAtNTk5ODEsMTcgKzYwMDI3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyNzc6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiA6ICggUlVMRV9JRCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyODM6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fTmFtZUFzc2lnbm1lbnRfMiA6ICggUlVMRV9JRCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19OYW1lQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI4MToxOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI4MjoyOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mjg3OjE6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mjg4OjI6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyODI6MjogKCBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI4MzozOiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgyODg6MjogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI4OTozOiBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nU3RyYXRlZ3lBY2Nlc3MoKS5nZXROYW1lSURUZXJtaW5hbFJ1bGVDYWxsXzJfMCgpKTsgCkBAIC02MDAyMiwxNyArNjAwNjgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19FY3ZpZXdGb2N1c2luZ0lkQXNzaWdubWVudF80IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI5MjoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19FY3ZpZXdGb2N1c2luZ0lkQXNzaWdubWVudF80IDogKCBSVUxFX0lEICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI5ODoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19FY3ZpZXdGb2N1c2luZ0lkQXNzaWdubWVudF80IDogKCBSVUxFX0lEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0Vjdmlld0ZvY3VzaW5nSWRBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mjk2OjE6ICggKCBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mjk3OjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMDI6MTogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMDM6MjogKCBSVUxFX0lEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODI5NzoyOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mjk4OjM6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMwMzoyOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzA0OjM6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEVjdmlld0ZvY3VzaW5nSWRJRFRlcm1pbmFsUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTYwMDYzLDE3ICs2MDEwOSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0ZvY3VzQXNzaWdubWVudF82IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMwNzoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Gb2N1c0Fzc2lnbm1lbnRfNiA6ICggcnVsZUZvY3VzaW5nRW51bSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMTM6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRm9jdXNBc3NpZ25tZW50XzYgOiAoIHJ1bGVGb2N1c2luZ0VudW0gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fRm9jdXNBc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzExOjE6ICggKCBydWxlRm9jdXNpbmdFbnVtICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzEyOjI6ICggcnVsZUZvY3VzaW5nRW51bSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMTc6MTogKCAoIHJ1bGVGb2N1c2luZ0VudW0gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMTg6MjogKCBydWxlRm9jdXNpbmdFbnVtICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMxMjoyOiAoIHJ1bGVGb2N1c2luZ0VudW0gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzEzOjM6IHJ1bGVGb2N1c2luZ0VudW0KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMxODoyOiAoIHJ1bGVGb2N1c2luZ0VudW0gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzE5OjM6IHJ1bGVGb2N1c2luZ0VudW0KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldEZvY3VzRm9jdXNpbmdFbnVtRW51bVJ1bGVDYWxsXzZfMCgpKTsgCkBAIC02MDEwOCwxNyArNjAxNTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19LZXlDb2RlQXNzaWdubWVudF83XzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzIyOjE6IHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0tleUNvZGVBc3NpZ25tZW50XzdfMyA6ICggUlVMRV9JRCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMjg6MTogcnVsZV9fRm9jdXNpbmdTdHJhdGVneV9fS2V5Q29kZUFzc2lnbm1lbnRfN18zIDogKCBSVUxFX0lEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX0tleUNvZGVBc3NpZ25tZW50XzdfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMjY6MTogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMjc6MjogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMzMjoxOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMzMzoyOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzI3OjI6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMjg6MzogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzMzOjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzMzQ6MzogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ1N0cmF0ZWd5QWNjZXNzKCkuZ2V0S2V5Q29kZUlEVGVybWluYWxSdWxlQ2FsbF83XzNfMCgpKTsgCkBAIC02MDE0OSwxNyArNjAxOTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODMzNzoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yIDogKCBSVUxFX0lEICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM0MzoxOiBydWxlX19Gb2N1c2luZ1N0cmF0ZWd5X19Nb2RpZmllcktleXNBc3NpZ25tZW50XzdfNF8yIDogKCBSVUxFX0lEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nU3RyYXRlZ3lfX01vZGlmaWVyS2V5c0Fzc2lnbm1lbnRfN180XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzQxOjE6ICggKCBSVUxFX0lEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzQyOjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNDc6MTogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNDg6MjogKCBSVUxFX0lEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM0MjoyOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzQzOjM6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM0ODoyOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzQ5OjM6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdTdHJhdGVneUFjY2VzcygpLmdldE1vZGlmaWVyS2V5c0lEVGVybWluYWxSdWxlQ2FsbF83XzRfMl8wKCkpOyAKQEAgLTYwMTkwLDE3ICs2MDIzNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzUyOjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIgOiAoIFJVTEVfSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzU4OjE6IHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX05hbWVBc3NpZ25tZW50XzIgOiAoIFJVTEVfSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fTmFtZUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNTY6MTogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNTc6MjogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM2MjoxOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM2MzoyOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzU3OjI6ICggUlVMRV9JRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNTg6MzogUlVMRV9JRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzYzOjI6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNjQ6MzogUlVMRV9JRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VuaGFuY2VyQWNjZXNzKCkuZ2V0TmFtZUlEVGVybWluYWxSdWxlQ2FsbF8yXzAoKSk7IApAQCAtNjAyMzEsMjMgKzYwMjc3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRm9jdXNpbmdFbmhhbmNlcl9fRm9jdXNpbmdTdHJhdGVnaWVzQXNzaWdubWVudF80IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM2NzoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM3MzoxOiBydWxlX19Gb2N1c2luZ0VuaGFuY2VyX19Gb2N1c2luZ1N0cmF0ZWdpZXNBc3NpZ25tZW50XzQgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0ZvY3VzaW5nRW5oYW5jZXJfX0ZvY3VzaW5nU3RyYXRlZ2llc0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzNzE6MTogKCAoICggUlVMRV9JRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzcyOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzc3OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM3ODoyOiAoICggUlVMRV9JRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM3MjoyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM3MzozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzc4OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzc5OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nRW5oYW5jZXJBY2Nlc3MoKS5nZXRGb2N1c2luZ1N0cmF0ZWdpZXNGb2N1c2luZ1N0cmF0ZWd5Q3Jvc3NSZWZlcmVuY2VfNF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM3NDozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzc1OjQ6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM4MDozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzgxOjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Rm9jdXNpbmdFbmhhbmNlckFjY2VzcygpLmdldEZvY3VzaW5nU3RyYXRlZ2llc0ZvY3VzaW5nU3RyYXRlZ3lJRFRlcm1pbmFsUnVsZUNhbGxfNF8wXzEoKSk7IApAQCAtNjAyODQsMjMgKzYwMzMwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0TGF5b3V0aW5nQXNzaWdubWVudF80IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM4NjoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRMYXlvdXRpbmdBc3NpZ25tZW50XzQgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM5MjoxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRMYXlvdXRpbmdBc3NpZ25tZW50XzQgOiAoICggUlVMRV9JRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1N0cmF0ZWd5RGVmYXVsdF9fRGVmYXVsdExheW91dGluZ0Fzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzOTA6MTogKCAoICggUlVMRV9JRCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4MzkxOjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzk2OjE6ICggKCAoIFJVTEVfSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM5NzoyOiAoICggUlVMRV9JRCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM5MToyOiAoICggUlVMRV9JRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM5MjozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzk3OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Mzk4OjM6ICggUlVMRV9JRCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRMYXlvdXRpbmdMYXlvdXRpbmdTdHJhdGVneUNyb3NzUmVmZXJlbmNlXzRfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzOTM6MzogKCBSVUxFX0lEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODM5NDo0OiBSVUxFX0lECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTgzOTk6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQwMDo0OiBSVUxFX0lECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFN0cmF0ZWd5RGVmYXVsdEFjY2VzcygpLmdldERlZmF1bHRMYXlvdXRpbmdMYXlvdXRpbmdTdHJhdGVneUlEVGVybWluYWxSdWxlQ2FsbF80XzBfMSgpKTsgCkBAIC02MDMzNywyMyArNjAzODMsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MDU6MTogcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0Rm9jdXNpbmdBc3NpZ25tZW50XzYgOiAoICggUlVMRV9JRCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxMToxOiBydWxlX19TdHJhdGVneURlZmF1bHRfX0RlZmF1bHRGb2N1c2luZ0Fzc2lnbm1lbnRfNiA6ICggKCBSVUxFX0lEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fU3RyYXRlZ3lEZWZhdWx0X19EZWZhdWx0Rm9jdXNpbmdBc3NpZ25tZW50XzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDA5OjE6ICggKCAoIFJVTEVfSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxMDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxNToxOiAoICggKCBSVUxFX0lEICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MTY6MjogKCAoIFJVTEVfSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MTA6MjogKCAoIFJVTEVfSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MTE6MzogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxNjoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxNzozOiAoIFJVTEVfSUQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTdHJhdGVneURlZmF1bHRBY2Nlc3MoKS5nZXREZWZhdWx0Rm9jdXNpbmdGb2N1c2luZ0VuaGFuY2VyQ3Jvc3NSZWZlcmVuY2VfNl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxMjozOiAoIFJVTEVfSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDEzOjQ6IFJVTEVfSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQxODozOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDE5OjQ6IFJVTEVfSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U3RyYXRlZ3lEZWZhdWx0QWNjZXNzKCkuZ2V0RGVmYXVsdEZvY3VzaW5nRm9jdXNpbmdFbmhhbmNlcklEVGVybWluYWxSdWxlQ2FsbF82XzBfMSgpKTsgCkBAIC02MDM5MCwyMyArNjA0MzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDI0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fU3RhdGljQXNzaWdubWVudF8yXzBfMCA6ICggKCAnc3RhdGljJyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQzMDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAgOiAoICggJ3N0YXRpYycgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1N0YXRpY0Fzc2lnbm1lbnRfMl8wXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDI4OjE6ICggKCAoICdzdGF0aWMnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0Mjk6MjogKCAoICdzdGF0aWMnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDM0OjE6ICggKCAoICdzdGF0aWMnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MzU6MjogKCAoICdzdGF0aWMnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDI5OjI6ICggKCAnc3RhdGljJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQzMDozOiAoICdzdGF0aWMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQzNToyOiAoICggJ3N0YXRpYycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MzY6MzogKCAnc3RhdGljJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFN0YXRpY1N0YXRpY0tleXdvcmRfMl8wXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MzE6MzogKCAnc3RhdGljJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0MzI6NDogJ3N0YXRpYycKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQzNzozOiAoICdzdGF0aWMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQzODo0OiAnc3RhdGljJwogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRTdGF0aWNTdGF0aWNLZXl3b3JkXzJfMF8wXzAoKSk7IApAQCAtNjA0NDMsMjMgKzYwNDg5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ0MzoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0V4dGVuc2lvbkFzc2lnbm1lbnRfMl8wXzEgOiAoICggJ2V4dGVuc2lvbicgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NDk6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xIDogKCAoICdleHRlbnNpb24nICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19FeHRlbnNpb25Bc3NpZ25tZW50XzJfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ0NzoxOiAoICggKCAnZXh0ZW5zaW9uJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDQ4OjI6ICggKCAnZXh0ZW5zaW9uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ1MzoxOiAoICggKCAnZXh0ZW5zaW9uJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDU0OjI6ICggKCAnZXh0ZW5zaW9uJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ0ODoyOiAoICggJ2V4dGVuc2lvbicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NDk6MzogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NTQ6MjogKCAoICdleHRlbnNpb24nICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDU1OjM6ICggJ2V4dGVuc2lvbicgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRFeHRlbnNpb25FeHRlbnNpb25LZXl3b3JkXzJfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDUwOjM6ICggJ2V4dGVuc2lvbicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDUxOjQ6ICdleHRlbnNpb24nCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NTY6MzogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NTc6NDogJ2V4dGVuc2lvbicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uRXh0ZW5zaW9uS2V5d29yZF8yXzBfMV8wKCkpOyAKQEAgLTYwNDk2LDIzICs2MDU0MiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8yXzBfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NjI6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0Njg6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMF8yIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8wXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDY2OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ2NzoyOiAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ3MjoxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0NzM6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0Njc6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0Njg6MzogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ3MzoyOiAoICggcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ3NDozOiAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVKdm1EZWNsYXJlZFR5cGVDcm9zc1JlZmVyZW5jZV8yXzBfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ2OTozOiAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDcwOjQ6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ3NTozOiAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDc2OjQ6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UGFyc2VyUnVsZUNhbGxfMl8wXzJfMF8xKCkpOyAKQEAgLTYwNTUzLDIzICs2MDU5OSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDgxOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgOiAoICggJyonICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDg3OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzJfMF8zXzAgOiAoICggJyonICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19XaWxkY2FyZEFzc2lnbm1lbnRfMl8wXzNfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0ODU6MTogKCAoICggJyonICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0ODY6MjogKCAoICcqJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ5MToxOiAoICggKCAnKicgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ5MjoyOiAoICggJyonICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDg2OjI6ICggKCAnKicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0ODc6MzogKCAnKicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDkyOjI6ICggKCAnKicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0OTM6MzogKCAnKicgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzdGVyaXNrS2V5d29yZF8yXzBfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NDg4OjM6ICggJyonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ4OTo0OiAnKicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODQ5NDozOiAoICcqJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg0OTU6NDogJyonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFdpbGRjYXJkQXN0ZXJpc2tLZXl3b3JkXzJfMF8zXzBfMCgpKTsgCkBAIC02MDYwNiwxNyArNjA2NTIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzJfMF8zXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTAwOjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTA2OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fTWVtYmVyTmFtZUFzc2lnbm1lbnRfMl8wXzNfMSA6ICggcnVsZVZhbGlkSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8yXzBfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUwNDoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MDU6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MTA6MTogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTExOjI6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTA1OjI6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTA2OjM6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MTE6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MTI6MzogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzBfM18xXzAoKSk7IApAQCAtNjA2NTEsMjMgKzYwNjk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MTU6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSA6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUyMToxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMl8xIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MTk6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUyMDoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MjU6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUyNjoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1MjA6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTIxOjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTI2OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUyNzozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlQ3Jvc3NSZWZlcmVuY2VfMl8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTIyOjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTIzOjQ6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1Mjg6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1Mjk6NDogcnVsZVF1YWxpZmllZE5hbWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMV8wXzEoKSk7IApAQCAtNjA3MDgsMTcgKzYwNzU0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMl8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUzNDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIgOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU0MDoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8yXzIgOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzJfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1Mzg6MTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTM5OjI6ICggcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTQ0OjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU0NToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODUzOToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU0MDozOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTQ1OjI6ICggcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTQ2OjM6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFBhcnNlclJ1bGVDYWxsXzJfMl8wKCkpOyAKQEAgLTYwNzUzLDI4ICs2MDc5OSwyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRnFuSW1wb3J0QXNzaWdubWVudF8yXzNfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NDk6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wIDogKCAoICducycgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NTU6MTogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19GcW5JbXBvcnRBc3NpZ25tZW50XzJfM18wIDogKCAoICducycgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ZxbkltcG9ydEFzc2lnbm1lbnRfMl8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTUzOjE6ICggKCAoICducycgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU1NDoyOiAoICggJ25zJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU1OToxOiAoICggKCAnbnMnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NjA6MjogKCAoICducycgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NTQ6MjogKCAoICducycgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NTU6MzogKCAnbnMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU2MDoyOiAoICggJ25zJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU2MTozOiAoICducycgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRGcW5JbXBvcnROc0tleXdvcmRfMl8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NTY6MzogKCAnbnMnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU1Nzo0OiAnbnMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NjI6MzogKCAnbnMnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU2Mzo0OiAnbnMnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEZxbkltcG9ydE5zS2V5d29yZF8yXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEZxbkltcG9ydE5zS2V5d29yZF8yXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTYwODA2LDE3ICs2MDg1MiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU2ODoxOiBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSA6ICggcnVsZVF1YWxpZmllZE5hbWUgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTc0OjE6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRGdWxseVF1YWxpZmllZE5hbWVBc3NpZ25tZW50XzJfM18xIDogKCBydWxlUXVhbGlmaWVkTmFtZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lQXNzaWdubWVudF8yXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1NzI6MTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTczOjI6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTc4OjE6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU3OToyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU3MzoyOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU3NDozOiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTc5OjI6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTgwOjM6IHJ1bGVRdWFsaWZpZWROYW1lCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkRnVsbHlRdWFsaWZpZWROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfM18xXzAoKSk7IApAQCAtNjA4NTEsMjMgKzYwODk3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU4MzoxOiBydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIgOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1ODk6MTogcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0Fubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU4NzoxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTg4OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU5MzoxOiAoICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTk0OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODU4ODoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1ODk6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1OTQ6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTk1OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlSnZtQW5ub3RhdGlvblR5cGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTkwOjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NTkxOjQ6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1OTY6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg1OTc6NDogcnVsZVF1YWxpZmllZE5hbWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUp2bUFubm90YXRpb25UeXBlUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMF8xKCkpOyAKQEAgLTYwOTA4LDE3ICs2MDk1NCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MDI6MTogcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYwODoxOiBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAgOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYwNjoxOiAoICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYwNzoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjEyOjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjEzOjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MDc6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYwODozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MTM6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYxNDozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJQYXJzZXJSdWxlQ2FsbF8zXzFfMF8wXzAoKSk7IApAQCAtNjA5NTMsMTcgKzYwOTk5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjE3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYyMzoxOiBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSA6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fRWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MjE6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MjI6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYyNzoxOiAoICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYyODoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjIyOjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MjM6MzogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjI4OjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2Mjk6MzogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUGFyc2VyUnVsZUNhbGxfM18xXzBfMV8xXzAoKSk7IApAQCAtNjA5OTgsMTcgKzYxMDQ0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2MzI6MTogcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSA6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjM4OjE6IHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjM2OjE6ICggKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODYzNzoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY0MjoxOiAoICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NDM6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2Mzc6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2Mzg6MzogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY0MzoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY0NDozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IApAQCAtNjEwNDMsMjMgKzYxMDg5LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCA6ICggKCBydWxlVmFsaWRJRCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY1MzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0VsZW1lbnRBc3NpZ25tZW50XzBfMF8wIDogKCAoIHJ1bGVWYWxpZElEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NTE6MTogKCAoICggcnVsZVZhbGlkSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY1MjoyOiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NTc6MTogKCAoICggcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY1ODoyOiAoICggcnVsZVZhbGlkSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NTI6MjogKCAoIHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjUzOjM6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjU4OjI6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY1OTozOiAoIHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEp2bU9wZXJhdGlvbkNyb3NzUmVmZXJlbmNlXzBfMF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjU0OjM6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjU1OjQ6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NjA6MzogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NjE6NDogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEp2bU9wZXJhdGlvblZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wXzBfMF8wXzEoKSk7IApAQCAtNjExMDAsMTcgKzYxMTQ2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NjY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY3MjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX1ZhbHVlQXNzaWdubWVudF8xIDogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NzA6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY3MToyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NzY6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY3NzoyOiAoIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2NzE6MjogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjcyOjM6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Njc3OjI6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY3ODozOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC02MTE0NSwxNyArNjExOTEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjgxOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCA6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY4NzoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Njg1OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2ODY6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NjkxOjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2OTI6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Njg2OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY4NzozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODY5MjoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2OTM6MzogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCkBAIC02MTE5MCwxNyArNjEyMzYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg2OTY6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MDI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MDA6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODcwMToyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MDY6MTogKCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODcwNzoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MDE6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzAyOjM6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzA3OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODcwODozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IApAQCAtNjEyMzUsMTcgKzYxMjgxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzExOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xIDogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzE3OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xIDogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzE1OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MTY6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzIxOjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MjI6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzE2OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODcxNzozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODcyMjoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MjM6MzogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzFfMV8wKCkpOyAKQEAgLTYxMjgwLDE3ICs2MTMyNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzI2OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MzI6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCA6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzMwOjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3MzE6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzM2OjE6ICggKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3Mzc6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzMxOjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODczMjozOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODczNzoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3Mzg6MzogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IApAQCAtNjEzMjUsMTcgKzYxMzcxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc0MToxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NDc6MTogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xIDogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc0NToxOiAoICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzQ2OjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc1MToxOiAoICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzUyOjI6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc0NjoyOiAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NDc6MzogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NTI6MjogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzUzOjM6IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IApAQCAtNjEzNzAsMjMgKzYxNDE2LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NTY6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSA6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc2MjoxOiBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xIDogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NjA6MTogKCAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc2MToyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NjY6MTogKCAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc2NzoyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NjE6MjogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzYyOjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzY3OjI6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc2ODozOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc2MzozOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc2NDo0OiBydWxlRmVhdHVyZUNhbGxJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzY5OjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzcwOjQ6IHJ1bGVGZWF0dXJlQ2FsbElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRGZWF0dXJlQ2FsbElEUGFyc2VyUnVsZUNhbGxfMF8xXzBfMSgpKTsgCkBAIC02MTQyNywxNyArNjE0NzMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3NzU6MTogcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3ODE6MTogcnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMgOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3Nzk6MTogKCAoIHJ1bGVYQXNzaWdubWVudCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc4MDoyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3ODU6MTogKCAoIHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc4NjoyOiAoIHJ1bGVYQXNzaWdubWVudCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3ODA6MjogKCBydWxlWEFzc2lnbm1lbnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4NzgxOjM6IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Nzg2OjI6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc4NzozOiBydWxlWEFzc2lnbm1lbnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMF8zXzAoKSk7IApAQCAtNjE0NzIsMjMgKzYxNTE4LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3OTA6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSA6ICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc5NjoxOiBydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIDogKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3OTQ6MTogKCAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc5NToyOiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MDA6MTogKCAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgwMToyOiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg3OTU6MjogKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4Nzk2OjM6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODAxOjI6ICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgwMjozOiAoIHJ1bGVPcE11bHRpQXNzaWduICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc5NzozOiAoIHJ1bGVPcE11bHRpQXNzaWduICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODc5ODo0OiBydWxlT3BNdWx0aUFzc2lnbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODAzOjM6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODA0OjQ6IHJ1bGVPcE11bHRpQXNzaWduCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcE11bHRpQXNzaWduUGFyc2VyUnVsZUNhbGxfMV8xXzBfMF8xXzBfMSgpKTsgCkBAIC02MTUyOSwxNyArNjE1NzUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MDk6MTogcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MTU6MTogcnVsZV9fWEFzc2lnbm1lbnRfX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MTM6MTogKCAoIHJ1bGVYQXNzaWdubWVudCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgxNDoyOiAoIHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MTk6MTogKCAoIHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgyMDoyOiAoIHJ1bGVYQXNzaWdubWVudCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MTQ6MjogKCBydWxlWEFzc2lnbm1lbnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODE1OjM6IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODIwOjI6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgyMTozOiBydWxlWEFzc2lnbm1lbnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IApAQCAtNjE1NzQsMjMgKzYxNjIwLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MjQ6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BPciApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgzMDoxOiBydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE9yICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4Mjg6MTogKCAoICggcnVsZU9wT3IgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgyOToyOiAoICggcnVsZU9wT3IgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4MzQ6MTogKCAoICggcnVsZU9wT3IgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgzNToyOiAoICggcnVsZU9wT3IgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4Mjk6MjogKCAoIHJ1bGVPcE9yICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODMwOjM6ICggcnVsZU9wT3IgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODM1OjI6ICggKCBydWxlT3BPciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgzNjozOiAoIHJ1bGVPcE9yICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgzMTozOiAoIHJ1bGVPcE9yICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODgzMjo0OiBydWxlT3BPcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODM3OjM6ICggcnVsZU9wT3IgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODM4OjQ6IHJ1bGVPcE9yCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wT3JQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC02MTYzMSwxNyArNjE2NzcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NDM6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NDk6MTogcnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NDc6MTogKCAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg0ODoyOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NTM6MTogKCAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg1NDoyOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NDg6MjogKCBydWxlWEFuZEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODQ5OjM6IHJ1bGVYQW5kRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODU0OjI6ICggcnVsZVhBbmRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg1NTozOiBydWxlWEFuZEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IApAQCAtNjE2NzYsMjMgKzYxNzIyLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODU4OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcEFuZCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg2NDoxOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BBbmQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NjI6MTogKCAoICggcnVsZU9wQW5kICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NjM6MjogKCAoIHJ1bGVPcEFuZCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg2ODoxOiAoICggKCBydWxlT3BBbmQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg2OToyOiAoICggcnVsZU9wQW5kICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODYzOjI6ICggKCBydWxlT3BBbmQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NjQ6MzogKCBydWxlT3BBbmQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODY5OjI6ICggKCBydWxlT3BBbmQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NzA6MzogKCBydWxlT3BBbmQgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg2NTozOiAoIHJ1bGVPcEFuZCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NjY6NDogcnVsZU9wQW5kCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4NzE6MzogKCBydWxlT3BBbmQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODcyOjQ6IHJ1bGVPcEFuZAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50T3BBbmRQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC02MTczMywxNyArNjE3NzksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODc3OjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODgzOjE6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg4MToxOiAoICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4ODI6MjogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4ODc6MTogKCAoIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODg4OjI6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODgyOjI6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODgzOjM6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4ODg6MjogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4ODk6MzogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IApAQCAtNjE3NzgsMjMgKzYxODI0LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4OTI6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BFcXVhbGl0eSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg5ODoxOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4OTY6MTogKCAoICggcnVsZU9wRXF1YWxpdHkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg5NzoyOiAoICggcnVsZU9wRXF1YWxpdHkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5MDI6MTogKCAoICggcnVsZU9wRXF1YWxpdHkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkwMzoyOiAoICggcnVsZU9wRXF1YWxpdHkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg4OTc6MjogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4ODk4OjM6ICggcnVsZU9wRXF1YWxpdHkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTAzOjI6ICggKCBydWxlT3BFcXVhbGl0eSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkwNDozOiAoIHJ1bGVPcEVxdWFsaXR5ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODg5OTozOiAoIHJ1bGVPcEVxdWFsaXR5ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkwMDo0OiBydWxlT3BFcXVhbGl0eQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTA1OjM6ICggcnVsZU9wRXF1YWxpdHkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTA2OjQ6IHJ1bGVPcEVxdWFsaXR5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wRXF1YWxpdHlQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC02MTgzNSwxNyArNjE4ODEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5MTE6MTogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTE3OjE6IHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIDogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkxNToxOiAoICggcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkxNjoyOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTIxOjE6ICggKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTIyOjI6ICggcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5MTY6MjogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkxNzozOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5MjI6MjogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkyMzozOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYUmVsYXRpb25hbEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC02MTg4MCwxNyArNjE5MjYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkyNjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5MzI6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5MzA6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTMxOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTM2OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkzNzoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkzMToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODkzMjozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTM3OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTM4OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wXzFfMCgpKTsgCkBAIC02MTkyNSwyMyArNjE5NzEsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NDE6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEgOiAoICggcnVsZU9wQ29tcGFyZSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk0NzoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSA6ICggKCBydWxlT3BDb21wYXJlICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTQ1OjE6ICggKCAoIHJ1bGVPcENvbXBhcmUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk0NjoyOiAoICggcnVsZU9wQ29tcGFyZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk1MToxOiAoICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NTI6MjogKCAoIHJ1bGVPcENvbXBhcmUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NDY6MjogKCAoIHJ1bGVPcENvbXBhcmUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NDc6MzogKCBydWxlT3BDb21wYXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk1MjoyOiAoICggcnVsZU9wQ29tcGFyZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk1MzozOiAoIHJ1bGVPcENvbXBhcmUgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk0ODozOiAoIHJ1bGVPcENvbXBhcmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTQ5OjQ6IHJ1bGVPcENvbXBhcmUKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk1NDozOiAoIHJ1bGVPcENvbXBhcmUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTU1OjQ6IHJ1bGVPcENvbXBhcmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcENvbXBhcmVQYXJzZXJSdWxlQ2FsbF8xXzFfMF8wXzFfMF8xKCkpOyAKQEAgLTYxOTgyLDE3ICs2MjAyOCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NjA6MTogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xIDogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk2NjoxOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEgOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk2NDoxOiAoICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk2NToyOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTcwOjE6ICggKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTcxOjI6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NjU6MjogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk2NjozOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5NzE6MjogKCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk3MjozOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IApAQCAtNjIwMjcsMjMgKzYyMDczLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk3NToxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEgOiAoICggcnVsZU9wT3RoZXIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5ODE6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE90aGVyICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk3OToxOiAoICggKCBydWxlT3BPdGhlciApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTgwOjI6ICggKCBydWxlT3BPdGhlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk4NToxOiAoICggKCBydWxlT3BPdGhlciApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTg2OjI6ICggKCBydWxlT3BPdGhlciApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk4MDoyOiAoICggcnVsZU9wT3RoZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5ODE6MzogKCBydWxlT3BPdGhlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5ODY6MjogKCAoIHJ1bGVPcE90aGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTg3OjM6ICggcnVsZU9wT3RoZXIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5ODI6MzogKCBydWxlT3BPdGhlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5ODM6NDogcnVsZU9wT3RoZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk4ODozOiAoIHJ1bGVPcE90aGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk4OTo0OiBydWxlT3BPdGhlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wT3RoZXJQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC02MjA4NCwxNyArNjIxMzAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk5NDoxOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIDogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwMDA6MTogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTg5OTg6MTogKCAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE4OTk5OjI6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDA0OjE6ICggKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAwNToyOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxODk5OToyOiAoIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAwMDozOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDA1OjI6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDA2OjM6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBZGRpdGl2ZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC02MjEyOSwyMyArNjIxNzUsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAwOToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcEFkZCApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAxNToxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcEFkZCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDEzOjE6ICggKCAoIHJ1bGVPcEFkZCApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDE0OjI6ICggKCBydWxlT3BBZGQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwMTk6MTogKCAoICggcnVsZU9wQWRkICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwMjA6MjogKCAoIHJ1bGVPcEFkZCApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAxNDoyOiAoICggcnVsZU9wQWRkICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDE1OjM6ICggcnVsZU9wQWRkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAyMDoyOiAoICggcnVsZU9wQWRkICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDIxOjM6ICggcnVsZU9wQWRkICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAxNjozOiAoIHJ1bGVPcEFkZCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwMTc6NDogcnVsZU9wQWRkCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwMjI6MzogKCBydWxlT3BBZGQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDIzOjQ6IHJ1bGVPcEFkZAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcEFkZFBhcnNlclJ1bGVDYWxsXzFfMF8wXzFfMF8xKCkpOyAKQEAgLTYyMTg2LDE3ICs2MjIzMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAyODoxOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSA6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDM0OjE6IHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIDogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwMzI6MTogKCAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDMzOjI6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDM4OjE6ICggKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAzOToyOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAzMzoyOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTAzNDozOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDM5OjI6ICggcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDQwOjM6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IApAQCAtNjIyMzEsMjMgKzYyMjc3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNDM6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSA6ICggKCBydWxlT3BNdWx0aSApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA0OToxOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIDogKCAoIHJ1bGVPcE11bHRpICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNDc6MTogKCAoICggcnVsZU9wTXVsdGkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA0ODoyOiAoICggcnVsZU9wTXVsdGkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNTM6MTogKCAoICggcnVsZU9wTXVsdGkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA1NDoyOiAoICggcnVsZU9wTXVsdGkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNDg6MjogKCAoIHJ1bGVPcE11bHRpICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDQ5OjM6ICggcnVsZU9wTXVsdGkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDU0OjI6ICggKCBydWxlT3BNdWx0aSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA1NTozOiAoIHJ1bGVPcE11bHRpICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA1MDozOiAoIHJ1bGVPcE11bHRpICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA1MTo0OiBydWxlT3BNdWx0aQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDU2OjM6ICggcnVsZU9wTXVsdGkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDU3OjQ6IHJ1bGVPcE11bHRpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wTXVsdGlQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzBfMSgpKTsgCkBAIC02MjI4OCwxNyArNjIzMzQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNjI6MTogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDY4OjE6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIDogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA2NjoxOiAoICggcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA2NzoyOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDcyOjE6ICggKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDczOjI6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNjc6MjogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA2ODozOiBydWxlWFVuYXJ5T3BlcmF0aW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNzM6MjogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA3NDozOiBydWxlWFVuYXJ5T3BlcmF0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCkBAIC02MjMzMywyMyArNjIzNzksMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwNzc6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgOiAoICggcnVsZU9wVW5hcnkgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwODM6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEgOiAoICggcnVsZU9wVW5hcnkgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwODE6MTogKCAoICggcnVsZU9wVW5hcnkgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA4MjoyOiAoICggcnVsZU9wVW5hcnkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwODc6MTogKCAoICggcnVsZU9wVW5hcnkgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA4ODoyOiAoICggcnVsZU9wVW5hcnkgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwODI6MjogKCAoIHJ1bGVPcFVuYXJ5ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDgzOjM6ICggcnVsZU9wVW5hcnkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MDg4OjI6ICggKCBydWxlT3BVbmFyeSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA4OTozOiAoIHJ1bGVPcFVuYXJ5ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwODQ6MzogKCBydWxlT3BVbmFyeSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkwODU6NDogcnVsZU9wVW5hcnkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA5MDozOiAoIHJ1bGVPcFVuYXJ5ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA5MTo0OiBydWxlT3BVbmFyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudE9wVW5hcnlQYXJzZXJSdWxlQ2FsbF8wXzFfMF8xKCkpOyAKQEAgLTYyMzkwLDE3ICs2MjQzNiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fT3BlcmFuZEFzc2lnbm1lbnRfMF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTA5NjoxOiBydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiA6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMDI6MTogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIgOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19PcGVyYW5kQXNzaWdubWVudF8wXzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTAwOjE6ICggKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTAxOjI6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMDY6MTogKCAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMDc6MjogKCBydWxlWFVuYXJ5T3BlcmF0aW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEwMToyOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTAyOjM6IHJ1bGVYVW5hcnlPcGVyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEwNzoyOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTA4OjM6IHJ1bGVYVW5hcnlPcGVyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzBfMl8wKCkpOyAKQEAgLTYyNDM1LDE3ICs2MjQ4MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTExOjE6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTExNzoxOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTExNToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMTY6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMjE6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTIyOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTE2OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTE3OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMjI6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMjM6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKQEAgLTYyNDgwLDIzICs2MjUyNiwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMjY6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xIDogKCAoIHJ1bGVPcFBvc3RmaXggKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMzI6MTogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8xIDogKCAoIHJ1bGVPcFBvc3RmaXggKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTMwOjE6ICggKCAoIHJ1bGVPcFBvc3RmaXggKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEzMToyOiAoICggcnVsZU9wUG9zdGZpeCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEzNjoxOiAoICggKCBydWxlT3BQb3N0Zml4ICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMzc6MjogKCAoIHJ1bGVPcFBvc3RmaXggKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMzE6MjogKCAoIHJ1bGVPcFBvc3RmaXggKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMzI6MzogKCBydWxlT3BQb3N0Zml4ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEzNzoyOiAoICggcnVsZU9wUG9zdGZpeCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEzODozOiAoIHJ1bGVPcFBvc3RmaXggKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMzM6MzogKCBydWxlT3BQb3N0Zml4ICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTEzNDo0OiBydWxlT3BQb3N0Zml4CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxMzk6MzogKCBydWxlT3BQb3N0Zml4ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE0MDo0OiBydWxlT3BQb3N0Zml4CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRPcFBvc3RmaXhQYXJzZXJSdWxlQ2FsbF8xXzBfMV8wXzEoKSk7IApAQCAtNjI1MzcsMjggKzYyNTgzLDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTQ1OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xIDogKCAoICc6OicgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNTE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEgOiAoICggJzo6JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE0OToxOiAoICggKCAnOjonICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNTA6MjogKCAoICc6OicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNTU6MTogKCAoICggJzo6JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTU2OjI6ICggKCAnOjonICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTUwOjI6ICggKCAnOjonICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTUxOjM6ICggJzo6JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNTY6MjogKCAoICc6OicgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNTc6MzogKCAnOjonICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNDb2xvbkNvbG9uS2V5d29yZF8xXzBfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE1MjozOiAoICc6OicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTUzOjQ6ICc6OicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE1ODozOiAoICc6OicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTU5OjQ6ICc6OicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNDb2xvbkNvbG9uS2V5d29yZF8xXzBfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwNixGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMDcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8wXzBfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02MjU5MCwyMyArNjI2MzYsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNjQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNzA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIgOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzBfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNjg6MTogKCAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE2OToyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNzQ6MTogKCAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE3NToyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNjk6MjogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTcwOjM6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTc1OjI6ICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE3NjozOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8wXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNzE6MzogKCBydWxlRmVhdHVyZUNhbGxJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxNzI6NDogcnVsZUZlYXR1cmVDYWxsSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE3NzozOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE3ODo0OiBydWxlRmVhdHVyZUNhbGxJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudEZlYXR1cmVDYWxsSURQYXJzZXJSdWxlQ2FsbF8xXzBfMF8wXzJfMF8xKCkpOyAKQEAgLTYyNjQ3LDE3ICs2MjY5MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE4MzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSA6ICggcnVsZVhBc3NpZ25tZW50ICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE4OToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1ZhbHVlQXNzaWdubWVudF8xXzBfMSA6ICggcnVsZVhBc3NpZ25tZW50ICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVmFsdWVBc3NpZ25tZW50XzFfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE4NzoxOiAoICggcnVsZVhBc3NpZ25tZW50ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTg4OjI6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE5MzoxOiAoICggcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTk0OjI6ICggcnVsZVhBc3NpZ25tZW50ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTE4ODoyOiAoIHJ1bGVYQXNzaWdubWVudCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxODk6MzogcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxOTQ6MjogKCBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MTk1OjM6IHJ1bGVYQXNzaWdubWVudAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMV8wXzFfMCgpKTsgCkBAIC02MjY5MiwyOCArNjI3MzgsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkxOTg6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEgOiAoICggJz8uJyApICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIwNDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSA6ICggKCAnPy4nICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19OdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjAyOjE6ICggKCAoICc/LicgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIwMzoyOiAoICggJz8uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIwODoxOiAoICggKCAnPy4nICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyMDk6MjogKCAoICc/LicgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyMDM6MjogKCAoICc/LicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyMDQ6MzogKCAnPy4nICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIwOToyOiAoICggJz8uJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIxMDozOiAoICc/LicgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZVF1ZXN0aW9uTWFya0Z1bGxTdG9wS2V5d29yZF8xXzFfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIwNTozOiAoICc/LicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjA2OjQ6ICc/LicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIxMTozOiAoICc/LicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjEyOjQ6ICc/LicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVRdWVzdGlvbk1hcmtGdWxsU3RvcEtleXdvcmRfMV8xXzBfMF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDcsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZVF1ZXN0aW9uTWFya0Z1bGxTdG9wS2V5d29yZF8xXzFfMF8wXzFfMV8wKCkpOyAKICAgICAgICAgICAgIH0KQEAgLTYyNzQ1LDI4ICs2Mjc5MSwyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIxNzoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMiA6ICggKCAnOjonICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjIzOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yIDogKCAoICc6OicgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyMjE6MTogKCAoICggJzo6JyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjIyOjI6ICggKCAnOjonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjI3OjE6ICggKCAoICc6OicgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIyODoyOiAoICggJzo6JyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIyMjoyOiAoICggJzo6JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIyMzozOiAoICc6OicgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjI4OjI6ICggKCAnOjonICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjI5OjM6ICggJzo6JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8xXzBfMF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyMjQ6MzogKCAnOjonICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIyNTo0OiAnOjonCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyMzA6MzogKCAnOjonICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIzMTo0OiAnOjonCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQ29sb25Db2xvbktleXdvcmRfMV8xXzBfMF8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA3LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0NvbG9uQ29sb25LZXl3b3JkXzFfMV8wXzBfMV8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjI3OTgsMTcgKzYyODQ0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTIzNjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjQyOjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjQwOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjQxOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNDY6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNDc6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI0MToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjQyOjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI0NzoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjQ4OjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8xXzFfMCgpKTsgCkBAIC02Mjg0MywxNyArNjI4ODksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzJfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNTE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjU3OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI1NToxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI1NjoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjYxOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjYyOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNTY6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI1NzozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNjI6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI2MzozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMV8yXzFfMCgpKTsgCkBAIC02Mjg4OCwyMyArNjI5MzQsMjMgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI2NjoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yIDogKCAoIHJ1bGVJZE9yU3VwZXIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNzI6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMiA6ICggKCBydWxlSWRPclN1cGVyICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8xXzFfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNzA6MTogKCAoICggcnVsZUlkT3JTdXBlciApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjcxOjI6ICggKCBydWxlSWRPclN1cGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mjc2OjE6ICggKCAoIHJ1bGVJZE9yU3VwZXIgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI3NzoyOiAoICggcnVsZUlkT3JTdXBlciApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI3MToyOiAoICggcnVsZUlkT3JTdXBlciApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI3MjozOiAoIHJ1bGVJZE9yU3VwZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mjc3OjI6ICggKCBydWxlSWRPclN1cGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mjc4OjM6ICggcnVsZUlkT3JTdXBlciApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNzM6MzogKCBydWxlSWRPclN1cGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI3NDo0OiBydWxlSWRPclN1cGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyNzk6MzogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI4MDo0OiBydWxlSWRPclN1cGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50SWRPclN1cGVyUGFyc2VyUnVsZUNhbGxfMV8xXzJfMF8xKCkpOyAKQEAgLTYyOTQ1LDI4ICs2Mjk5MSwyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRPcGVyYXRpb25DYWxsQXNzaWdubWVudF8xXzFfM18wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI4NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCA6ICggKCAnKCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyOTE6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAgOiAoICggJygnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mjg5OjE6ICggKCAoICcoJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjkwOjI6ICggKCAnKCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyOTU6MTogKCAoICggJygnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyOTY6MjogKCAoICcoJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI5MDoyOiAoICggJygnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjkxOjM6ICggJygnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI5NjoyOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mjk3OjM6ICggJygnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xXzFfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MjkyOjM6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI5Mzo0OiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTI5ODozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkyOTk6NDogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMV8xXzNfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDc4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDc5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdE9wZXJhdGlvbkNhbGxMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzFfMV8zXzBfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02Mjk5OCwxNyArNjMwNDQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMDQ6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAgOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMxMDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCA6ICggcnVsZVhTaG9ydENsb3N1cmUgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzA4OjE6ICggKCBydWxlWFNob3J0Q2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMwOToyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMxNDoxOiAoICggcnVsZVhTaG9ydENsb3N1cmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMTU6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMDk6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMTA6MzogcnVsZVhTaG9ydENsb3N1cmUKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMxNToyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMxNjozOiBydWxlWFNob3J0Q2xvc3VyZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMF8wKCkpOyAKQEAgLTYzMDQzLDE3ICs2MzA4OSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzE5OjE6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMjU6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzIzOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMjQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzI5OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMzA6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzI0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMyNTozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMzMDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzMzE6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8zXzFfMV8wXzAoKSk7IApAQCAtNjMwODgsMTcgKzYzMTM0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMzNDoxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNDA6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMzODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzM5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM0NDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzQ1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTMzOToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNDA6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNDU6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzQ2OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfM18xXzFfMV8xXzAoKSk7IApAQCAtNjMxMzMsMTcgKzYzMTc5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNDk6MTogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCA6ICggcnVsZVhDbG9zdXJlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM1NToxOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80IDogKCBydWxlWENsb3N1cmUgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNTM6MTogKCAoIHJ1bGVYQ2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM1NDoyOiAoIHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNTk6MTogKCAoIHJ1bGVYQ2xvc3VyZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM2MDoyOiAoIHJ1bGVYQ2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNTQ6MjogKCBydWxlWENsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzU1OjM6IHJ1bGVYQ2xvc3VyZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzYwOjI6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM2MTozOiBydWxlWENsb3N1cmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hDbG9zdXJlUGFyc2VyUnVsZUNhbGxfMV8xXzRfMCgpKTsgCkBAIC02MzE3OCwxNyArNjMyMjQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNjQ6MTogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNzA6MTogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNjg6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM2OToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNzQ6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM3NToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNjk6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzcwOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mzc1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM3NjozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wXzAoKSk7IApAQCAtNjMyMjMsMTcgKzYzMjY5LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzNzk6MTogcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM4NToxOiBydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzODM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM4NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzODk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM5MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzODQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mzg1OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5MzkwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTM5MTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCkBAIC02MzI2OCwxNyArNjMzMTQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mzk0OjE6IHJ1bGVfX1hMaXN0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQwMDoxOiBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mzk4OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTkzOTk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDA0OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MDU6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Mzk5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQwMDozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQwNToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MDY6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsgCkBAIC02MzMxMywxNyArNjMzNTksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MDk6MTogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MTU6MTogcnVsZV9fWExpc3RMaXRlcmFsX19FbGVtZW50c0Fzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MTM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQxNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MTk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQyMDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MTQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDE1OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDIwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQyMTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IApAQCAtNjMzNTgsMTcgKzYzNDA0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MjQ6MTogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MzA6MTogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQyODoxOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQyOToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDM0OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDM1OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0Mjk6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQzMDozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0MzU6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQzNjozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMF8wKCkpOyAKQEAgLTYzNDAzLDE3ICs2MzQ0OSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzFfMF8wXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0Mzk6MTogcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ0NToxOiBydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ0MzoxOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ0NDoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDQ5OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDUwOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NDQ6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ0NTozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NTA6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ1MTozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMV8wXzBfMV8xXzAoKSk7IApAQCAtNjM0NDgsMjggKzYzNDk0LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NTQ6MTogcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSA6ICggKCAnfCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NjA6MTogcnVsZV9fWENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8xXzBfMSA6ICggKCAnfCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzFfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ1ODoxOiAoICggKCAnfCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ1OToyOiAoICggJ3wnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDY0OjE6ICggKCAoICd8JyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDY1OjI6ICggKCAnfCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NTk6MjogKCAoICd8JyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ2MDozOiAoICd8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NjU6MjogKCAoICd8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ2NjozOiAoICd8JyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhWZXJ0aWNhbExpbmVLZXl3b3JkXzFfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDYxOjM6ICggJ3wnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ2Mjo0OiAnfCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ2NzozOiAoICd8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0Njg6NDogJ3wnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhWZXJ0aWNhbExpbmVLZXl3b3JkXzFfMF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA4LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMV8wXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02MzUwMSwxNyArNjM1NDcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0NzM6MTogcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0Nzk6MTogcnVsZV9fWENsb3N1cmVfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0Nzc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ3ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0ODM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ4NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0Nzg6MjogKCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDc5OjM6IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDg0OjI6ICggcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ4NTozOiBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25JbkNsb3N1cmVQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IApAQCAtNjM1NDYsMTcgKzYzNTkyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0V4cHJlc3Npb25zQXNzaWdubWVudF8xXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDg4OjE6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wIDogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ5NDoxOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCA6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fRXhwcmVzc2lvbnNBc3NpZ25tZW50XzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0OTI6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0OTM6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ5ODoxOiAoICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTQ5OToyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDkzOjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk0OTQ6MzogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NDk5OjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1MDA6MzogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfMV8wXzAoKSk7IApAQCAtNjM1OTEsMTcgKzYzNjM3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUwMzoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTA5OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCA6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTA3OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTA4OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1MTM6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1MTQ6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUwODoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTA5OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUxNDoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTE1OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0p2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzBfMF8xXzBfMCgpKTsgCkBAIC02MzYzNiwxNyArNjM2ODIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19EZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1MTg6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTI0OjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUyMjoxOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUyMzoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTI4OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTI5OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1MjM6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUyNDozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Mjk6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTUzMDozOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8wXzBfMV8xXzFfMCgpKTsgCkBAIC02MzY4MSwyOCArNjM3MjcsMjggQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU2hvcnRDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTMzOjE6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiA6ICggKCAnfCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Mzk6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwbGljaXRTeW50YXhBc3NpZ25tZW50XzBfMF8yIDogKCAoICd8JyApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Mzc6MTogKCAoICggJ3wnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Mzg6MjogKCAoICd8JyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU0MzoxOiAoICggKCAnfCcgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU0NDoyOiAoICggJ3wnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTM4OjI6ICggKCAnfCcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Mzk6MzogKCAnfCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTQ0OjI6ICggKCAnfCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NDU6MzogKCAnfCcgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhWZXJ0aWNhbExpbmVLZXl3b3JkXzBfMF8yXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTQwOjM6ICggJ3wnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU0MTo0OiAnfCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU0NjozOiAoICd8JyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NDc6NDogJ3wnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheFZlcnRpY2FsTGluZUtleXdvcmRfMF8wXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaChpbnB1dCwxMDgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTA5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwbGljaXRTeW50YXhWZXJ0aWNhbExpbmVLZXl3b3JkXzBfMF8yXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjM3MzQsMTcgKzYzNzgwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NTI6MTogcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU1ODoxOiBydWxlX19YU2hvcnRDbG9zdXJlX19FeHByZXNzaW9uQXNzaWdubWVudF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NTY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU1NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NjI6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU2MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NTc6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTU4OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTYzOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU2NDozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC02Mzc3OSwxNyArNjM4MjUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Njc6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NzM6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fSWZBc3NpZ25tZW50XzMgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19JZkFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NzE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU3MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1Nzc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU3ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1NzI6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTczOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTc4OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU3OTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldElmWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IApAQCAtNjM4MjQsMTcgKzYzODcwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1ODI6MTogcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU4ODoxOiBydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWElmRXhwcmVzc2lvbl9fVGhlbkFzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1ODY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU4NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1OTI6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU5MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk1ODc6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTg4OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTkzOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTU5NDozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFRoZW5YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCkBAIC02Mzg2OSwxNyArNjM5MTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NTk3OjE6IHJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYwMzoxOiBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSWZFeHByZXNzaW9uX19FbHNlQXNzaWdubWVudF82XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjAxOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2MDI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjA3OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2MDg6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjAyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYwMzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYwODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2MDk6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzFfMCgpKTsgCkBAIC02MzkxNCwxNyArNjM5NjAsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYxMjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYxODoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8wXzBfMF8xIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzBfMF8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjE2OjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjE3OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2MjI6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2MjM6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYxNzoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjE4OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYyMzoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjI0OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMl8wXzBfMF8xXzAoKSk7IApAQCAtNjM5NTksMTcgKzY0MDA1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjI3OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjMzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjMxOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2MzI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjM3OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2Mzg6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjMyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYzMzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTYzODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2Mzk6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3dpdGNoWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yXzBfMV8wKCkpOyAKQEAgLTY0MDA0LDE3ICs2NDA1MCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjQyOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjQ4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yXzFfMF8wXzAgOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMV8wXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NDY6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NDc6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY1MjoxOiAoICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY1MzoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjQ3OjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NDg6MzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjUzOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NTQ6MzogcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Kdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8yXzFfMF8wXzBfMCgpKTsgCkBAIC02NDA0OSwxNyArNjQwOTUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NTc6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NjM6MTogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fU3dpdGNoQXNzaWdubWVudF8yXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NjE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY2MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2Njc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY2ODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2NjI6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjYzOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjY4OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY2OTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTd2l0Y2hYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMV8xXzAoKSk7IApAQCAtNjQwOTQsMTcgKzY0MTQwLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY3MjoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQgOiAoIHJ1bGVYQ2FzZVBhcnQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njc4OjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19DYXNlc0Fzc2lnbm1lbnRfNCA6ICggcnVsZVhDYXNlUGFydCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQ2FzZXNBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njc2OjE6ICggKCBydWxlWENhc2VQYXJ0ICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njc3OjI6ICggcnVsZVhDYXNlUGFydCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2ODI6MTogKCAoIHJ1bGVYQ2FzZVBhcnQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2ODM6MjogKCBydWxlWENhc2VQYXJ0ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY3NzoyOiAoIHJ1bGVYQ2FzZVBhcnQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njc4OjM6IHJ1bGVYQ2FzZVBhcnQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY4MzoyOiAoIHJ1bGVYQ2FzZVBhcnQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njg0OjM6IHJ1bGVYQ2FzZVBhcnQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXNlc1hDYXNlUGFydFBhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCkBAIC02NDEzOSwxNyArNjQxODUsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY4NzoxOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjkzOjE6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19EZWZhdWx0QXNzaWdubWVudF81XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY5MToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NjkyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY5NzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njk4OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTY5MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2OTM6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk2OTg6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Njk5OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMl8wKCkpOyAKQEAgLTY0MTg0LDE3ICs2NDIzMCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTcwMjoxOiBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzA4OjE6IHJ1bGVfX1hDYXNlUGFydF9fVHlwZUd1YXJkQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX1R5cGVHdWFyZEFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3MDY6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzA3OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzEyOjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTcxMzoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTcwNzoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTcwODozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzEzOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzE0OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFR5cGVHdWFyZEp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtNjQyMjksMTcgKzY0Mjc1LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzE3OjE6IHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzIzOjE6IHJ1bGVfX1hDYXNlUGFydF9fQ2FzZUFzc2lnbm1lbnRfMl8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENhc2VQYXJ0X19DYXNlQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzIxOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3MjI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzI3OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3Mjg6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzIyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTcyMzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTcyODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3Mjk6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENhc2VYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMV8wKCkpOyAKQEAgLTY0Mjc0LDE3ICs2NDMyMCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzMyOjE6IHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3Mzg6MTogcnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXNlUGFydF9fVGhlbkFzc2lnbm1lbnRfM18wXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzM2OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3Mzc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzQyOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3NDM6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzM3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTczODozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc0MzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3NDQ6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFRoZW5YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMF8xXzAoKSk7IApAQCAtNjQzMTksMjggKzY0MzY1LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhc2VQYXJ0X19GYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc0NzoxOiBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEgOiAoICggJywnICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzUzOjE6IHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSA6ICggKCAnLCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzUxOjE6ICggKCAoICcsJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzUyOjI6ICggKCAnLCcgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3NTc6MTogKCAoICggJywnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3NTg6MjogKCAoICcsJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc1MjoyOiAoICggJywnICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzUzOjM6ICggJywnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc1ODoyOiAoICggJywnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzU5OjM6ICggJywnICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0RmFsbFRocm91Z2hDb21tYUtleXdvcmRfM18xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzU0OjM6ICggJywnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc1NTo0OiAnLCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc2MDozOiAoICcsJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3NjE6NDogJywnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEZhbGxUaHJvdWdoQ29tbWFLZXl3b3JkXzNfMV8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDgwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDgxLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaENvbW1hS2V5d29yZF8zXzFfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02NDM3MiwxNyArNjQ0MTgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc2NjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc3MjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzBfMF8zIDogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzcwOjE6ICggKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzcxOjI6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3NzY6MTogKCAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3Nzc6MjogKCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc3MToyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzcyOjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc3NzoyOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Nzc4OjM6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzBfMF8zXzAoKSk7IApAQCAtNjQ0MTcsMTcgKzY0NDYzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc4MToxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0ZvckV4cHJlc3Npb25Bc3NpZ25tZW50XzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3ODc6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc4NToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5Nzg2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc5MToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzkyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTc4NjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3ODc6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3OTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5NzkzOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtNjQ0NjIsMTcgKzY0NTA4LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk3OTY6MTogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgwMjoxOiBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MDA6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgwMToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MDY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgwNzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MDE6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODAyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODA3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgwODozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCkBAIC02NDUwNywxNyArNjQ1NTMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODExOjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCA6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MTc6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18wIDogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MTU6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MTY6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgyMToxOiAoICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgyMjoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODE2OjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MTc6MzogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODIyOjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MjM6MzogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzNfMF8wKCkpOyAKQEAgLTY0NTUyLDE3ICs2NDU5OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgyNjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fSW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MzI6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0luaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODMwOjE6ICggKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODMxOjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4MzY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4Mzc6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgzMToyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODMyOjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTgzNzoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODM4OjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbml0RXhwcmVzc2lvbnNYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKQEAgLTY0NTk3LDE3ICs2NDY0MywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg0MToxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg0NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg0NToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODQ2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg1MToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODUyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg0NjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NDc6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODUzOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCkBAIC02NDY0MiwxNyArNjQ2ODgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NTY6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NjI6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NjA6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg2MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NjY6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg2NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NjE6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODYyOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODY3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg2ODozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18wXzAoKSk7IApAQCAtNjQ2ODcsMTcgKzY0NzMzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NzE6MTogcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg3NzoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NzU6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg3NjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4ODE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg4MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4NzY6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODc3OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODgyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg4MzozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfN18xXzFfMCgpKTsgCkBAIC02NDczMiwxNyArNjQ3NzgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODg2OjE6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19FYWNoRXhwcmVzc2lvbkFzc2lnbm1lbnRfOSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg5MjoxOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODkwOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4OTE6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODk2OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4OTc6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5ODkxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg5MjozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTg5NzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk4OTg6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RWFjaEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzlfMCgpKTsgCkBAIC02NDc3NywxNyArNjQ4MjMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTAxOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfMyA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkwNzoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19QcmVkaWNhdGVBc3NpZ25tZW50XzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTA1OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MDY6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTExOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTA2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkwNzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkxMjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MTM6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCkBAIC02NDgyMiwxNyArNjQ4NjgsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkxNjoxOiBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTIyOjE6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0JvZHlBc3NpZ25tZW50XzUgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkyMDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTIxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkyNjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTI3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkyMToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MjI6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5Mjc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTI4OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKQEAgLTY0ODY3LDE3ICs2NDkxMywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MzE6MTogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTM3OjE6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MzU6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTkzNjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5NDE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk0MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5MzY6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTM3OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTQyOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk0MzozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTY0OTEyLDE3ICs2NDk1OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81IgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk0NjoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk1MjoxOiBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX1ByZWRpY2F0ZUFzc2lnbm1lbnRfNSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk1MDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTUxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk1NjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTU3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk1MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5NTI6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5NTc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTU4OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCkBAIC02NDk1NywxNyArNjUwMDMsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk2MToxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIDogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk2NzoxOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIDogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0V4cHJlc3Npb25zQXNzaWdubWVudF8yXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTY1OjE6ICggKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTY2OjI6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5NzE6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5NzI6MjogKCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk2NjoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTY3OjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk3MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTczOjM6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfMl8wXzAoKSk7IApAQCAtNjUwMDIsMjggKzY1MDQ4LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk3NjoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzAgOiAoICggJ3ZhcicgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5ODI6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wIDogKCAoICd2YXInICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk4MDoxOiAoICggKCAndmFyJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTgxOjI6ICggKCAndmFyJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk4NjoxOiAoICggKCAndmFyJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTg3OjI6ICggKCAndmFyJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOTk4MToyOiAoICggJ3ZhcicgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5ODI6MzogKCAndmFyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5ODc6MjogKCAoICd2YXInICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTg4OjM6ICggJ3ZhcicgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZVZhcktleXdvcmRfMV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTgzOjM6ICggJ3ZhcicgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTg0OjQ6ICd2YXInCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5ODk6MzogKCAndmFyJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5OTA6NDogJ3ZhcicKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVWYXJLZXl3b3JkXzFfMF8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoKGlucHV0LDEwOSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxMTAsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlVmFyS2V5d29yZF8xXzBfMCgpKTsgCiAgICAgICAgICAgICB9CkBAIC02NTA1NSwxNyArNjUxMDEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTk5OTU6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAwMToxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fVHlwZUFzc2lnbm1lbnRfMl8wXzBfMCA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1R5cGVBc3NpZ25tZW50XzJfMF8wXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE5OTk5OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAwMDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAwNToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMDY6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMDA6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMDE6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAwNjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAwNzozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMl8wXzBfMF8wKCkpOyAKQEAgLTY1MTAwLDE3ICs2NTE0NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAxMDoxOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDE2OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzBfMF8xIDogKCBydWxlVmFsaWRJRCApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMTQ6MTogKCAoIHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDE1OjI6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDIwOjE6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAyMToyOiAoIHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAxNToyOiAoIHJ1bGVWYWxpZElEICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAxNjozOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDIxOjI6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDIyOjM6IHJ1bGVWYWxpZElECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8yXzBfMF8xXzAoKSk7IApAQCAtNjUxNDUsMTcgKzY1MTkxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMjU6MTogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDMxOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDI5OjE6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAzMDoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAzNToxOiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMzY6MjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMzA6MjogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwMzE6MzogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAzNjoyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDAzNzozOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldE5hbWVWYWxpZElEUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IApAQCAtNjUxOTAsMTcgKzY1MjM2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDQwOjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDQ2OjE6IHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19SaWdodEFzc2lnbm1lbnRfM18xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1JpZ2h0QXNzaWdubWVudF8zXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDQ0OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNDU6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDUwOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNTE6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDQ1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA0NjozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA1MToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNTI6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKQEAgLTY1MjM1LDE3ICs2NTI4MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNTU6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNjE6MTogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDU5OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA2MDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA2NToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNjY6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNjA6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNjE6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA2NjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA2NzozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMCgpKTsgCkBAIC02NTI4MCwxNyArNjUzMjYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDcwOjE6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDc2OjE6IHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSA6ICggcnVsZVZhbGlkSUQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA3NDoxOiAoICggcnVsZVZhbGlkSUQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwNzU6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwODA6MTogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDgxOjI6ICggcnVsZVZhbGlkSUQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDc1OjI6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDc2OjM6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwODE6MjogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwODI6MzogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtNjUzMjUsMTcgKzY1MzcxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwODU6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fUGFyYW1ldGVyVHlwZUFzc2lnbm1lbnRfMCA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDkxOjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMDg5OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA5MDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA5NToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwOTY6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwOTA6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAwOTE6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA5NjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDA5NzozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzAoKSk7IApAQCAtNjUzNzAsMTcgKzY1NDE2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMDA6MTogcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fTmFtZUFzc2lnbm1lbnRfMSA6ICggcnVsZVZhbGlkSUQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTA2OjE6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEgOiAoIHJ1bGVWYWxpZElEICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX05hbWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTA0OjE6ICggKCBydWxlVmFsaWRJRCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEwNToyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDExMDoxOiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMTE6MjogKCBydWxlVmFsaWRJRCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMDU6MjogKCBydWxlVmFsaWRJRCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMDY6MzogcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDExMToyOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDExMjozOiBydWxlVmFsaWRJRAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtNjU0MTUsMTcgKzY1NDYxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTE1OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEyMToxOiBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMTk6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMjA6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEyNToxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEyNjoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTIwOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMjE6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTI2OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMjc6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IApAQCAtNjU0NjAsMTcgKzY1NTA2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMzA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMzY6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEzNDoxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEzNToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTQwOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTQxOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxMzU6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDEzNjozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNDE6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE0MjozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzJfMV8wKCkpOyAKQEAgLTY1NTA1LDIzICs2NTU1MSwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNDU6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yIDogKCAoIHJ1bGVJZE9yU3VwZXIgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNTE6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yIDogKCAoIHJ1bGVJZE9yU3VwZXIgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTQ5OjE6ICggKCAoIHJ1bGVJZE9yU3VwZXIgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE1MDoyOiAoICggcnVsZUlkT3JTdXBlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE1NToxOiAoICggKCBydWxlSWRPclN1cGVyICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNTY6MjogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNTA6MjogKCAoIHJ1bGVJZE9yU3VwZXIgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNTE6MzogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE1NjoyOiAoICggcnVsZUlkT3JTdXBlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE1NzozOiAoIHJ1bGVJZE9yU3VwZXIgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNTI6MzogKCBydWxlSWRPclN1cGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE1Mzo0OiBydWxlSWRPclN1cGVyCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNTg6MzogKCBydWxlSWRPclN1cGVyICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE1OTo0OiBydWxlSWRPclN1cGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50SWRPclN1cGVyUGFyc2VyUnVsZUNhbGxfMl8wXzEoKSk7IApAQCAtNjU1NjIsMjggKzY1NjA4LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNjQ6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCA6ICggKCAnKCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNzA6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzNfMCA6ICggKCAnKCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE2ODoxOiAoICggKCAnKCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE2OToyOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTc0OjE6ICggKCAoICcoJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTc1OjI6ICggKCAnKCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNjk6MjogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE3MDozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNzU6MjogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE3NjozOiAoICcoJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTcxOjM6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE3Mjo0OiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE3NzozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxNzg6NDogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjU2MTUsMTcgKzY1NjYxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTgzOjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wIDogKCBydWxlWFNob3J0Q2xvc3VyZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxODk6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAgOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE4NzoxOiAoICggcnVsZVhTaG9ydENsb3N1cmUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxODg6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxOTM6MTogKCAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTk0OjI6ICggcnVsZVhTaG9ydENsb3N1cmUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTg4OjI6ICggcnVsZVhTaG9ydENsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMTg5OjM6IHJ1bGVYU2hvcnRDbG9zdXJlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxOTQ6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAxOTU6MzogcnVsZVhTaG9ydENsb3N1cmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYU2hvcnRDbG9zdXJlUGFyc2VyUnVsZUNhbGxfM18xXzBfMCgpKTsgCkBAIC02NTY2MCwxNyArNjU3MDYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDE5ODoxOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjA0OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIwMjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjAzOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIwODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjA5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIwMzoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMDQ6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMDk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjEwOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMF8wKCkpOyAKQEAgLTY1NzA1LDE3ICs2NTc1MSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMTM6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjE5OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMTc6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIxODoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMjM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIyNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMTg6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjE5OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjI0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIyNTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzFfMV8wKCkpOyAKQEAgLTY1NzUwLDE3ICs2NTc5NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjI4OjE6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQgOiAoIHJ1bGVYQ2xvc3VyZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMzQ6MTogcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCA6ICggcnVsZVhDbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjMyOjE6ICggKCBydWxlWENsb3N1cmUgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMzM6MjogKCBydWxlWENsb3N1cmUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjM4OjE6ICggKCBydWxlWENsb3N1cmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyMzk6MjogKCBydWxlWENsb3N1cmUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjMzOjI6ICggcnVsZVhDbG9zdXJlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIzNDozOiBydWxlWENsb3N1cmUKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDIzOToyOiAoIHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNDA6MzogcnVsZVhDbG9zdXJlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzWENsb3N1cmVQYXJzZXJSdWxlQ2FsbF80XzAoKSk7IApAQCAtNjU3OTUsMjMgKzY1ODQxLDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjQzOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjQ5OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0NvbnN0cnVjdG9yQXNzaWdubWVudF8yIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjQ3OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNDg6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjUzOjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNTQ6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjQ4OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI0OTozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI1NDoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNTU6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3Rvckp2bUNvbnN0cnVjdG9yQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI1MDozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI1MTo0OiBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjU2OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjU3OjQ6IHJ1bGVRdWFsaWZpZWROYW1lCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3Rvckp2bUNvbnN0cnVjdG9yUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMF8xKCkpOyAKQEAgLTY1ODUyLDE3ICs2NTg5OCwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNjI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI2ODoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI2NjoxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI2NzoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjcyOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjczOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNjc6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI2ODozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyNzM6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI3NDozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfM18xXzAoKSk7IApAQCAtNjU4OTcsMTcgKzY1OTQzLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjc3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX1R5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI4MzoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyODE6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyODI6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI4NzoxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI4ODoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjgyOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyODM6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjg4OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyODk6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzNfMl8xXzAoKSk7IApAQCAtNjU5NDIsMjggKzY1OTg4LDI4IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyOTI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCA6ICggKCAnKCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyOTg6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fRXhwbGljaXRDb25zdHJ1Y3RvckNhbGxBc3NpZ25tZW50XzRfMCA6ICggKCAnKCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbEFzc2lnbm1lbnRfNF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI5NjoxOiAoICggKCAnKCcgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI5NzoyOiAoICggJygnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzAyOjE6ICggKCAoICcoJyApICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzAzOjI6ICggKCAnKCcgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAyOTc6MjogKCAoICcoJyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDI5ODozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMDM6MjogKCAoICcoJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMwNDozOiAoICcoJyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfNF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMjk5OjM6ICggJygnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMwMDo0OiAnKCcKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMwNTozOiAoICcoJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMDY6NDogJygnCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfNF8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsNzksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbExlZnRQYXJlbnRoZXNpc0tleXdvcmRfNF8wXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjU5OTUsMTcgKzY2MDQxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMTE6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMCA6ICggcnVsZVhTaG9ydENsb3N1cmUgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzE3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAgOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzE1OjE6ICggKCBydWxlWFNob3J0Q2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMxNjoyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMyMToxOiAoICggcnVsZVhTaG9ydENsb3N1cmUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMjI6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMTY6MjogKCBydWxlWFNob3J0Q2xvc3VyZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMTc6MzogcnVsZVhTaG9ydENsb3N1cmUKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMyMjoyOiAoIHJ1bGVYU2hvcnRDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMyMzozOiBydWxlWFNob3J0Q2xvc3VyZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzWFNob3J0Q2xvc3VyZVBhcnNlclJ1bGVDYWxsXzRfMV8wXzAoKSk7IApAQCAtNjYwNDAsMTcgKzY2MDg2LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMyNjoxOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzAgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMzI6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMzMDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzMxOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMzNjoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzM3OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDMzMToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMzI6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzMzc6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzM4OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF80XzFfMV8wXzAoKSk7IApAQCAtNjYwODUsMTcgKzY2MTMxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzQxOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzQ3OjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzQ1OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNDY6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzUxOjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNTI6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzQ2OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM0NzozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM1MjoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNTM6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzRfMV8xXzFfMV8wKCkpOyAKQEAgLTY2MTMwLDE3ICs2NjE3NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNTY6MTogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81IDogKCBydWxlWENsb3N1cmUgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzYyOjE6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSA6ICggcnVsZVhDbG9zdXJlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNjA6MTogKCAoIHJ1bGVYQ2xvc3VyZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM2MToyOiAoIHJ1bGVYQ2xvc3VyZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNjY6MTogKCAoIHJ1bGVYQ2xvc3VyZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM2NzoyOiAoIHJ1bGVYQ2xvc3VyZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNjE6MjogKCBydWxlWENsb3N1cmUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzYyOjM6IHJ1bGVYQ2xvc3VyZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzY3OjI6ICggcnVsZVhDbG9zdXJlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM2ODozOiBydWxlWENsb3N1cmUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c1hDbG9zdXJlUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKQEAgLTY2MTc1LDI4ICs2NjIyMSwyOCBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzcxOjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgOiAoICggJ3RydWUnICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzc3OjE6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fSXNUcnVlQXNzaWdubWVudF8xXzEgOiAoICggJ3RydWUnICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNzU6MTogKCAoICggJ3RydWUnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNzY6MjogKCAoICd0cnVlJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM4MToxOiAoICggKCAndHJ1ZScgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM4MjoyOiAoICggJ3RydWUnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzc2OjI6ICggKCAndHJ1ZScgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNzc6MzogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzgyOjI6ICggKCAndHJ1ZScgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzODM6MzogKCAndHJ1ZScgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRJc1RydWVUcnVlS2V5d29yZF8xXzFfMCgpKTsgCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjAzNzg6MzogKCAndHJ1ZScgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzc5OjQ6ICd0cnVlJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzg0OjM6ICggJ3RydWUnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM4NTo0OiAndHJ1ZScKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlVHJ1ZUtleXdvcmRfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTEwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlVHJ1ZUtleXdvcmRfMV8xXzAoKSk7IAogICAgICAgICAgICAgfQpAQCAtNjYyMjgsMTcgKzY2Mjc0LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWE51bWJlckxpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM5MDoxOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEgOiAoIHJ1bGVOdW1iZXIgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzk2OjE6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggcnVsZU51bWJlciApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzk0OjE6ICggKCBydWxlTnVtYmVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzk1OjI6ICggcnVsZU51bWJlciApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MDA6MTogKCAoIHJ1bGVOdW1iZXIgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MDE6MjogKCBydWxlTnVtYmVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDM5NToyOiAoIHJ1bGVOdW1iZXIgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwMzk2OjM6IHJ1bGVOdW1iZXIKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQwMToyOiAoIHJ1bGVOdW1iZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDAyOjM6IHJ1bGVOdW1iZXIKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRWYWx1ZU51bWJlclBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC02NjI3MywxNyArNjYzMTksMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDA1OjE6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggUlVMRV9TVFJJTkcgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDExOjE6IHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSA6ICggUlVMRV9TVFJJTkcgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFN0cmluZ0xpdGVyYWxfX1ZhbHVlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQwOToxOiAoICggUlVMRV9TVFJJTkcgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MTA6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MTU6MTogKCAoIFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDE2OjI6ICggUlVMRV9TVFJJTkcgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDEwOjI6ICggUlVMRV9TVFJJTkcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDExOjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MTY6MjogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MTc6MzogUlVMRV9TVFJJTkcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTY2MzE0LDIzICs2NjM2MCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MjA6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDI2OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMyA6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fVHlwZUFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MjQ6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQyNToyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MzA6MTogKCAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQzMToyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MjU6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDI2OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDMxOjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQzMjozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8zXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDI3OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDI4OjQ6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MzM6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0MzQ6NDogcnVsZVF1YWxpZmllZE5hbWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfM18wXzEoKSk7IApAQCAtNjYzNzEsMTcgKzY2NDE3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDM5OjE6IHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80IDogKCBydWxlQXJyYXlCcmFja2V0cyApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NDU6MTogcnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQgOiAoIHJ1bGVBcnJheUJyYWNrZXRzICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fQXJyYXlEaW1lbnNpb25zQXNzaWdubWVudF80KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ0MzoxOiAoICggcnVsZUFycmF5QnJhY2tldHMgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NDQ6MjogKCBydWxlQXJyYXlCcmFja2V0cyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NDk6MTogKCAoIHJ1bGVBcnJheUJyYWNrZXRzICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDUwOjI6ICggcnVsZUFycmF5QnJhY2tldHMgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDQ0OjI6ICggcnVsZUFycmF5QnJhY2tldHMgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDQ1OjM6IHJ1bGVBcnJheUJyYWNrZXRzCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NTA6MjogKCBydWxlQXJyYXlCcmFja2V0cyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NTE6MzogcnVsZUFycmF5QnJhY2tldHMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0QXJyYXlEaW1lbnNpb25zQXJyYXlCcmFja2V0c1BhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCkBAIC02NjQxNiwxNyArNjY0NjIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ1NDoxOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDYwOjE6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ1ODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDU5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ2NDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDY1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ1OToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NjA6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NjU6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDY2OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTY2NDYxLDE3ICs2NjUwNywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ2OToxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ3NToxOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ3MzoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDc0OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ3OToxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDgwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ3NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0NzU6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0ODA6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDgxOjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCkBAIC02NjUwNiwxNyArNjY1NTIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0ODQ6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0OTA6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0ODg6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ4OToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0OTQ6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ5NToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA0ODk6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDkwOjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDk1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDQ5NjozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IApAQCAtNjY1NTEsMTcgKzY2NTk3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNDk5OjE6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wIDogKCBydWxlWENhdGNoQ2xhdXNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUwNToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCA6ICggcnVsZVhDYXRjaENsYXVzZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MDM6MTogKCAoIHJ1bGVYQ2F0Y2hDbGF1c2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MDQ6MjogKCBydWxlWENhdGNoQ2xhdXNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUwOToxOiAoICggcnVsZVhDYXRjaENsYXVzZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUxMDoyOiAoIHJ1bGVYQ2F0Y2hDbGF1c2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTA0OjI6ICggcnVsZVhDYXRjaENsYXVzZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MDU6MzogcnVsZVhDYXRjaENsYXVzZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTEwOjI6ICggcnVsZVhDYXRjaENsYXVzZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MTE6MzogcnVsZVhDYXRjaENsYXVzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldENhdGNoQ2xhdXNlc1hDYXRjaENsYXVzZVBhcnNlclJ1bGVDYWxsXzNfMF8wXzAoKSk7IApAQCAtNjY1OTYsMTcgKzY2NjQyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUxNDoxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMF8xXzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MjA6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUxODoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTE5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUyNDoxOiAoICggcnVsZVhFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTI1OjI6ICggcnVsZVhFeHByZXNzaW9uICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUxOToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MjA6MzogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MjU6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTI2OjM6IHJ1bGVYRXhwcmVzc2lvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMV8xXzAoKSk7IApAQCAtNjY2NDEsMTcgKzY2Njg3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1Mjk6MTogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUzNToxOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xIDogKCBydWxlWEV4cHJlc3Npb24gKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MzM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDUzNDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1Mzk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU0MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1MzQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTM1OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTQwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU0MTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCkBAIC02NjY4NiwxNyArNjY3MzIsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTQ0OjE6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSA6ICggcnVsZVhFeHByZXNzaW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU1MDoxOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fUGFyYW1Bc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTQ4OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NDk6MjogKCBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTU0OjE6ICggKCBydWxlWEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NTU6MjogKCBydWxlWEV4cHJlc3Npb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTQ5OjI6ICggcnVsZVhFeHByZXNzaW9uICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU1MDozOiBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU1NToyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NTY6MzogcnVsZVhFeHByZXNzaW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC02NjczMSwxNyArNjY3NzcsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMyIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NTk6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NjU6MTogcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzMgOiAoIHJ1bGVYRXhwcmVzc2lvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NjM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU2NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1Njk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU3MDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1NjQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTY1OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTcwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU3MTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IApAQCAtNjY3NzYsMTcgKzY2ODIyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWENhdGNoQ2xhdXNlX19EZWNsYXJlZFBhcmFtQXNzaWdubWVudF8yIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU3NDoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU4MDoxOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIgOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1Nzg6MTogKCAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTc5OjI6ICggcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTg0OjE6ICggKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU4NToyOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU3OToyOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU4MDozOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTg1OjI6ICggcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTg2OjM6IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1GdWxsSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKQEAgLTY2ODIxLDE3ICs2Njg2NywxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1ODk6MTogcnVsZV9fWENhdGNoQ2xhdXNlX19FeHByZXNzaW9uQXNzaWdubWVudF80IDogKCBydWxlWEV4cHJlc3Npb24gKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTk1OjE6IHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCA6ICggcnVsZVhFeHByZXNzaW9uICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hDYXRjaENsYXVzZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1OTM6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDU5NDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1OTk6MTogKCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYwMDoyOiAoIHJ1bGVYRXhwcmVzc2lvbiApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA1OTQ6MjogKCBydWxlWEV4cHJlc3Npb24gKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNTk1OjM6IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjAwOjI6ICggcnVsZVhFeHByZXNzaW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYwMTozOiBydWxlWEV4cHJlc3Npb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKQEAgLTY2ODY2LDE3ICs2NjkxMiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYwNDoxOiBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjEwOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2MDg6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjA5OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjE0OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYxNToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYwOToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYxMDozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjE1OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjE2OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRQYXJhbVR5cGVzSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IApAQCAtNjY5MTEsMTcgKzY2OTU3LDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2MTk6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjI1OjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1BhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjIzOjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYyNDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYyOToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2MzA6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2MjQ6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2MjU6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYzMDoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYzMTozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0p2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IApAQCAtNjY5NTYsMTcgKzY3MDAyLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2MzQ6MTogcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjQwOjE6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX1JldHVyblR5cGVBc3NpZ25tZW50XzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjM4OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDYzOToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY0NDoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NDU6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2Mzk6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NDA6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY0NToyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY0NjozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IApAQCAtNjcwMDEsMjMgKzY3MDQ3LDIzIEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjQ5OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjU1OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wIDogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjUzOjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NTQ6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjU5OjE6ICggKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NjA6MjogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjU0OjI6ICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY1NTozOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY2MDoyOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NjE6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVDcm9zc1JlZmVyZW5jZV8wXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjU2OjM6ICggcnVsZVF1YWxpZmllZE5hbWUgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjU3OjQ6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NjI6MzogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NjM6NDogcnVsZVF1YWxpZmllZE5hbWUKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wXzBfMSgpKTsgCkBAIC02NzA1OCwxNyArNjcxMDQsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjY4OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NzQ6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NzI6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NzM6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY3ODoxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY3OToyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjczOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2NzQ6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjc5OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2ODA6MzogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKQEAgLTY3MTAzLDE3ICs2NzE0OSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY4MzoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2ODk6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjg3OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjg4OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2OTM6MTogKCAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2OTQ6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY4ODoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjg5OjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDY5NDoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNjk1OjM6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzJfMV8wKCkpOyAKQEAgLTY3MTQ4LDIzICs2NzE5NCwyMyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA2OTg6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX1R5cGVBc3NpZ25tZW50XzFfNF8xIDogKCAoIHJ1bGVWYWxpZElEICkgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzA0OjE6IHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSA6ICggKCBydWxlVmFsaWRJRCApICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MDI6MTogKCAoICggcnVsZVZhbGlkSUQgKSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcwMzoyOiAoICggcnVsZVZhbGlkSUQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MDg6MTogKCAoICggcnVsZVZhbGlkSUQgKSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcwOToyOiAoICggcnVsZVZhbGlkSUQgKSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MDM6MjogKCAoIHJ1bGVWYWxpZElEICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzA0OjM6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzA5OjI6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcxMDozOiAoIHJ1bGVWYWxpZElEICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZUNyb3NzUmVmZXJlbmNlXzFfNF8xXzAoKSk7IAogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzA1OjM6ICggcnVsZVZhbGlkSUQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzA2OjQ6IHJ1bGVWYWxpZElECisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MTE6MzogKCBydWxlVmFsaWRJRCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MTI6NDogcnVsZVZhbGlkSUQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzRfMV8wXzEoKSk7IApAQCAtNjcyMDUsMTcgKzY3MjUxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MTc6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MjM6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSA6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcyMToxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcyMjoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzI3OjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzI4OjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MjI6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcyMzozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3Mjg6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDcyOTozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV80XzJfMV8wKCkpOyAKQEAgLTY3MjUwLDE3ICs2NzI5NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfNF8yXzJfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3MzI6MTogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xIDogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDczODoxOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEgOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDczNjoxOiAoICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDczNzoyOiAoIHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzQyOjE6ICggKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzQzOjI6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3Mzc6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDczODozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NDM6MjogKCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc0NDozOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV80XzJfMl8xXzAoKSk7IApAQCAtNjcyOTUsMTcgKzY3MzQxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzQ3OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wIDogKCBydWxlSnZtVXBwZXJCb3VuZCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NTM6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzAgOiAoIHJ1bGVKdm1VcHBlckJvdW5kICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc1MToxOiAoICggcnVsZUp2bVVwcGVyQm91bmQgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NTI6MjogKCBydWxlSnZtVXBwZXJCb3VuZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NTc6MTogKCAoIHJ1bGVKdm1VcHBlckJvdW5kICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzU4OjI6ICggcnVsZUp2bVVwcGVyQm91bmQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzUyOjI6ICggcnVsZUp2bVVwcGVyQm91bmQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzUzOjM6IHJ1bGVKdm1VcHBlckJvdW5kCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NTg6MjogKCBydWxlSnZtVXBwZXJCb3VuZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NTk6MzogcnVsZUp2bVVwcGVyQm91bmQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1VcHBlckJvdW5kUGFyc2VyUnVsZUNhbGxfMl8wXzBfMCgpKTsgCkBAIC02NzM0MCwxNyArNjczODYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NjI6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEgOiAoIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzY4OjE6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xIDogKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgOwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc2NjoxOiAoICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc2NzoyOiAoIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzcyOjE6ICggKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzczOjI6ICggcnVsZUp2bVVwcGVyQm91bmRBbmRlZCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3Njc6MjogKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc2ODozOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3NzM6MjogKCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc3NDozOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtVXBwZXJCb3VuZEFuZGVkUGFyc2VyUnVsZUNhbGxfMl8wXzFfMCgpKTsgCkBAIC02NzM4NSwxNyArNjc0MzEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3Nzc6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAgOiAoIHJ1bGVKdm1Mb3dlckJvdW5kICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc4MzoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCA6ICggcnVsZUp2bUxvd2VyQm91bmQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzgxOjE6ICggKCBydWxlSnZtTG93ZXJCb3VuZCApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc4MjoyOiAoIHJ1bGVKdm1Mb3dlckJvdW5kICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc4NzoxOiAoICggcnVsZUp2bUxvd2VyQm91bmQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3ODg6MjogKCBydWxlSnZtTG93ZXJCb3VuZCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3ODI6MjogKCBydWxlSnZtTG93ZXJCb3VuZCApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3ODM6MzogcnVsZUp2bUxvd2VyQm91bmQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc4ODoyOiAoIHJ1bGVKdm1Mb3dlckJvdW5kICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc4OTozOiBydWxlSnZtTG93ZXJCb3VuZAogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0p2bUxvd2VyQm91bmRQYXJzZXJSdWxlQ2FsbF8yXzFfMF8wKCkpOyAKQEAgLTY3NDMwLDE3ICs2NzQ3NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc5MjoxOiBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSA6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA3OTg6MTogcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEgOiAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzk2OjE6ICggKCBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzk3OjI6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MDI6MTogKCAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MDM6MjogKCBydWxlSnZtTG93ZXJCb3VuZEFuZGVkICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDc5NzoyOiAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwNzk4OjM6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgwMzoyOiAoIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODA0OjM6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1Mb3dlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzFfMV8wKCkpOyAKQEAgLTY3NDc1LDE3ICs2NzUyMSwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODA3OjE6IHJ1bGVfX0p2bVVwcGVyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEgOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgxMzoxOiBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgxMToxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MTI6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MTc6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODE4OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODEyOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODEzOjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MTg6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MTk6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKQEAgLTY3NTIwLDE3ICs2NzU2NiwxNyBAQAogCiAKICAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MjI6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4Mjg6MTogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewogCiAgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKICAgICAgICAgCQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODI2OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgyNzoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgzMjoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4MzM6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4Mjc6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4Mjg6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgzMzoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgzNDozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC02NzU2NSwxNyArNjc2MTEsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIgotICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDgzNzoxOiBydWxlX19Kdm1Mb3dlckJvdW5kX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIDogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NDM6MTogcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NDE6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODQyOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODQ3OjE6ICggKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg0ODoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg0MjoyOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg0MzozOiBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODQ4OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODQ5OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCkBAIC02NzYxMCwxNyArNjc2NTYsMTcgQEAKIAogCiAgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODUyOjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CisgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODU4OjE6IHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSA6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSA7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKIAogICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CiAgICAgICAgIAkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg1NjoxOiAoICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NTc6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NjI6MTogKCAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODYzOjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODU3OjI6ICggcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODU4OjM6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NjM6MjogKCBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NjQ6MzogcnVsZUp2bVR5cGVSZWZlcmVuY2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IApAQCAtNjc2NTUsMTcgKzY3NzAxLDE3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQiCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODY3OjE6IHJ1bGVfX1hJbXBvcnRTZWN0aW9uX19JbXBvcnREZWNsYXJhdGlvbnNBc3NpZ25tZW50IDogKCBydWxlWEltcG9ydERlY2xhcmF0aW9uICkgOworICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg3MzoxOiBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCA6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApIDsKICAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YSW1wb3J0U2VjdGlvbl9fSW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAKICAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOwogICAgICAgICAJCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NzE6MTogKCAoIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NzI6MjogKCBydWxlWEltcG9ydERlY2xhcmF0aW9uICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg3NzoxOiAoICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoyMDg3ODoyOiAoIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODcyOjI6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4NzM6MzogcnVsZVhJbXBvcnREZWNsYXJhdGlvbgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjIwODc4OjI6ICggcnVsZVhJbXBvcnREZWNsYXJhdGlvbiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MjA4Nzk6MzogcnVsZVhJbXBvcnREZWNsYXJhdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0U2VjdGlvbkFjY2VzcygpLmdldEltcG9ydERlY2xhcmF0aW9uc1hJbXBvcnREZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IApAQCAtNjgwNDIsMTAgKzY4MDg4LDEwIEBACiAgICAgfQogICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDgxX0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTE4X0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTE4X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgxMDozOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NjgxMDozOiBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMTlfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMTlfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODE2OjM6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo2ODE2OjM6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCgpOwpAQCAtNjgwNTUsMzAgKzY4MTAxLDE1IEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxMThfSW50ZXJuYWxTdHJhdGVneURTTAotCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMjBfSW50ZXJuYWxTdHJhdGVneURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMjBfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTYxOjM6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3MTYxOjM6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDEyMF9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTE5X0ludGVybmFsU3RyYXRlZ3lEU0wKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTIxX0ludGVybmFsU3RyYXRlZ3lEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTIxX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM1MDozOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNTA6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxNjc6MzogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjcxNjc6MzogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOworICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtNjgwODksMTEgKzY4MTIwLDExIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEyMl9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEyMl9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1Mzk6MzogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1Mzk6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzM1NjozOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjczNTY6MzogcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOworICAgICAgICBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTY4MTA0LDExICs2ODEzNSwxMSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMjNfSW50ZXJuYWxTdHJhdGVneURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMjNfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzI4OjM6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzI4OjM6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NDU6MzogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc1NDU6MzogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xKCk7CisgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC02ODExOSwxMSArNjgxNTAsMTEgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTI0X0ludGVybmFsU3RyYXRlZ3lEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTI0X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODEwNjozOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTA2OjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzczNDozOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzczNDozOiBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOworICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtNjgxMzQsMTEgKzY4MTY1LDExIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEyNV9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEyNV9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTk6MzogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MTk6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6ODExMjozOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4MTEyOjM6IHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CisgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTY4MTQ5LDExICs2ODE4MCwxMSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMjZfSW50ZXJuYWxTdHJhdGVneURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMjZfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODA4OjM6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo4ODA4OjM6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MjU6MzogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg2MjU6MzogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CisgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAoKTsKIAogICAgICAgICBzdGF0ZS5fZnNwLS07CiAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CkBAIC02ODE2NCwxMSArNjgxOTUsMTEgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTI3X0ludGVybmFsU3RyYXRlZ3lEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTI3X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA3ODozOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkwNzg6MzogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MTQ6MzogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjg4MTQ6MzogcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOworICAgICAgICBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtNjgxNzksMTEgKzY4MjEwLDExIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEyOF9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEyOF9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNjc6MzogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MjY3OjM6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5MDg0OjM6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTA4NDozOiBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV9fMCgpOworICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTY4MTk0LDggKzY4MjI1LDIzIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEyOV9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEyOV9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MDI6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk0MDI6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTI3MzozOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjkyNzM6MzogcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxMjlfSW50ZXJuYWxTdHJhdGVneURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMzBfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMzBfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDA4OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NDA4OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSgpOwpAQCAtNjgyMDUsMTIgKzY4MjUxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxMjlfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDEzMF9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEzMV9JbnRlcm5hbFN0cmF0ZWd5RFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEzMV9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDA6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MDA6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTMyX0ludGVybmFsU3RyYXRlZ3lEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTMyX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTcwNjozOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6OTcwNjozOiBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfXzAoKTsKQEAgLTY4MjIwLDEyICs2ODI2NiwxMiBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTMxX0ludGVybmFsU3RyYXRlZ3lEU0wKKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxMzJfSW50ZXJuYWxTdHJhdGVneURTTAogCi0gICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMzJfSW50ZXJuYWxTdHJhdGVneURTTAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxMzJfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzI2OjM6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo5NzI2OjM6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEzM19JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDEzM19JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MzI6MzogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjk3MzI6MzogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfNAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80KCk7CkBAIC02ODIzNSwxMiArNjgyODEsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDEzMl9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTMzX0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTQwX0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTQwX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OTk6MzogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY5OTozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTQxX0ludGVybmFsU3RyYXRlZ3lEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTQxX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3MDU6MzogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDcwNTozOiBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCgpOwpAQCAtNjgyNTAsMTIgKzY4Mjk2LDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNDBfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE0MV9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE0N19JbnRlcm5hbFN0cmF0ZWd5RFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE0N19JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjExNjcwOjM6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY3MDozOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNDhfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNDhfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMTY3NjozOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTE2NzY6MzogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfNl9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wKCk7CkBAIC02ODI2NSwxMiArNjgzMTEsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE0N19JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTQ4X0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTUwX0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTUwX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMzA6MzogKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTIxMzA6MzogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNTFfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNTFfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzNjozOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMjEzNjozOiBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wKCk7CkBAIC02ODI4MCwxMiArNjgzMjYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE1MF9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTUxX0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTYzX0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTYzX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNjM6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyNjM6MzogcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNjRfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNjRfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI2OTozOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI2OTozOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wKCk7CkBAIC02ODI5NSwxMiArNjgzNDEsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE2M19JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTY0X0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTY0X0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTY0X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQyODk6MzogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mjg5OjM6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE2NV9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE2NV9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Mjk1OjM6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfNCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDI5NTozOiBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80CiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7CiAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzQoKTsKQEAgLTY4MzEwLDMwICs2ODM1NiwxNSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTY0X0ludGVybmFsU3RyYXRlZ3lEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTY4X0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTY4X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NDk6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzQ5OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfXzAKLSAgICAgICAgewotICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCgpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE2OF9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTY1X0ludGVybmFsU3RyYXRlZ3lEU0wKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTY5X0ludGVybmFsU3RyYXRlZ3lEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTY5X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3NzY6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0Nzc2OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzU1OjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNDc1NTozOiBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wCiAgICAgICAgIHsKICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfMik7Ci0gICAgICAgIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAoKTsKKyAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCgpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTY4MzQ0LDggKzY4Mzc1LDIzIEBACiAKICAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3MF9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3MF9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODAyOjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODAyOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTQ3ODI6MzogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80X18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0NzgyOjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAKKyAgICAgICAgeworICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKKyAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCgpOworCisgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE3MF9JbnRlcm5hbFN0cmF0ZWd5RFNMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE3MV9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE3MV9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODA4OjM6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE0ODA4OjM6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNQogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUoKTsKQEAgLTY4MzU1LDMwICs2ODQwMSwxNSBAQAogCiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTcwX0ludGVybmFsU3RyYXRlZ3lEU0wKLQotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTM6MzogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY5MzozOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgotICAgICAgICB7Ci0gICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpOwotCi0gICAgICAgIHN0YXRlLl9mc3AtLTsKLSAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKLQotICAgICAgICB9Ci0gICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTcxX0ludGVybmFsU3RyYXRlZ3lEU0wKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4MzU6NDogKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTgzNTo0OiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU2OTk6MzogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTY5OTozOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMgogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwotICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQ2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpOworICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMigpOwogCiAgICAgICAgIHN0YXRlLl9mc3AtLTsKICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKQEAgLTY4Mzg5LDExICs2ODQyMCwxMSBAQAogCiAgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzdfSW50ZXJuYWxTdHJhdGVneURTTAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNzdfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg2MjozOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNTg2MjozOiBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODQxOjQ6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTU4NDE6NDogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKLSAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wKCk7CisgICAgICAgIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19DYXRjaENsYXVzZXNBc3NpZ25tZW50XzNfMF8wKCk7CiAKICAgICAgICAgc3RhdGUuX2ZzcC0tOwogICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOwpAQCAtNjg0MDQsOCArNjg0MzUsMjMgQEAKIAogICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTc4X0ludGVybmFsU3RyYXRlZ3lEU0wKICAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTc4X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzNzU6MzogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wICkKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE2Mzc1OjM6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODY4OjM6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF8xX18wICkKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE1ODY4OjM6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMAorICAgICAgICB7CisgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOworICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAoKTsKKworICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxNzhfSW50ZXJuYWxTdHJhdGVneURTTAorCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzlfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxNzlfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjM4MTozOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTYzODE6MzogcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wKCk7CkBAIC02ODQxNSwxMiArNjg0NjEsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE3OF9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTc5X0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTgwX0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTgwX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1OTE6MzogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTY1OTE6MzogcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxODFfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxODFfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU5NzozOiAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNjU5NzozOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wXzFfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wKCk7CkBAIC02ODQzMCwxMiArNjg0NzYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE4MF9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTgxX0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTg0X0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTg0X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNTA6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1MDozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMAorICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTg1X0ludGVybmFsU3RyYXRlZ3lEU0wKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTg1X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcwNTY6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzA1NjozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCgpOwpAQCAtNjg0NDUsMTIgKzY4NDkxLDEyIEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxODRfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE4NV9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAKLSAgICAvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDE4Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc3lucHJlZDE4Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgICAKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE3MTg1OjM6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCApCi0gICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE4NTozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxODdfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxODdfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzE5MTozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfXzAgKQorICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTcxOTE6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMAogICAgICAgICB7CiAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XXzIpOwogICAgICAgICBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wKCk7CkBAIC02ODQ2MCwxMiArNjg1MDYsMTIgQEAKIAogICAgICAgICB9CiAgICAgfQotICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE4Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMCisgICAgLy8gJEFOVExSIGVuZCBzeW5wcmVkMTg3X0ludGVybmFsU3RyYXRlZ3lEU0wKIAotICAgIC8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTg3X0ludGVybmFsU3RyYXRlZ3lEU0wKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5wcmVkMTg3X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyAgIAotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMjA6MzogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKQotICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTczMjA6MzogcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wCisgICAgLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxODhfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN5bnByZWQxODhfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7ICAgCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyNjozOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApCisgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxNzMyNjozOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAKICAgICAgICAgewogICAgICAgICBwdXNoRm9sbG93KEZPTExPV18yKTsKICAgICAgICAgcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF8yX18wKCk7CkBAIC02ODQ3NSw3ICs2ODUyMSw3IEBACiAKICAgICAgICAgfQogICAgIH0KLSAgICAvLyAkQU5UTFIgZW5kIHN5bnByZWQxODdfSW50ZXJuYWxTdHJhdGVneURTTAorICAgIC8vICRBTlRMUiBlbmQgc3lucHJlZDE4OF9JbnRlcm5hbFN0cmF0ZWd5RFNMCiAKICAgICAvLyBEZWxlZ2F0ZWQgcnVsZXMKIApAQCAtNjg1MDcsMjUgKzY4NTUzLDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxMzFfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTgxX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTMxX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDEyMF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDEyMF9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQxODFfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC02ODU3NywyMCArNjg2MDksNiBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTg0X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTg0X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDcwX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CkBAIC02ODYxOSwyMCArNjg2MzcsNiBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTQwX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTQwX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDdfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKQEAgLTY4NjQ3LDYgKzY4NjUxLDIwIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNTFfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQxNTFfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTIyX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CkBAIC02ODY2MSw2ICs2ODY3OSwyMCBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTE5X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMTE5X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE2OV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwpAQCAtNjg2ODksMjUgKzY4NzIxLDExIEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNDdfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTMzX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTQ3X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE1MF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkgewotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDE1MF9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQxMzNfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC02ODczMSwyMCArNjg3NDksNiBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE2NF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwpAQCAtNjg4MDEsMTEgKzY4ODA1LDI1IEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxODZfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTg1X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTg2X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDE4NV9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNDFfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQxNDFfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC02ODgyOSwyMCArNjg4NDcsNiBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTYzX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7Ci0gICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwotICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTYzX0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOwotICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOwotICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKLSAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDQ4X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CkBAIC02ODg3MSwxMSArNjg4NzUsMTEgQEAKICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOwogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9Ci0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDExOF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkgeworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNzlfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN5bnByZWQxMThfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICBzeW5wcmVkMTc5X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtNjg4ODUsMTEgKzY4ODg5LDI1IEBACiAgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxNjhfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTMwX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CiAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOwogICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5wcmVkMTY4X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgc3lucHJlZDEzMF9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICAgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN5bnByZWQxODhfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bnByZWQxODhfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCiAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOwogICAgICAgICB9CkBAIC02ODk4Myw2ICs2OTAwMSwyMCBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTY1X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMTY1X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhc3RhdGUuZmFpbGVkOworICAgICAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDhfSW50ZXJuYWxTdHJhdGVneURTTCgpIHsKICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CiAgICAgICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKQEAgLTY4OTk3LDExICs2OTAyOSwyNSBAQAogICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTgwX0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3lucHJlZDE3MV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkgewogICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKICAgICAgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3lucHJlZDE4MF9JbnRlcm5hbFN0cmF0ZWd5RFNMX2ZyYWdtZW50KCk7IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgIHN5bnByZWQxNzFfSW50ZXJuYWxTdHJhdGVneURTTF9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisgICAgICAgIGlucHV0LnJld2luZChzdGFydCk7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgICAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzeW5wcmVkMTQ4X0ludGVybmFsU3RyYXRlZ3lEU0woKSB7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgICAgICBpbnQgc3RhcnQgPSBpbnB1dC5tYXJrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5wcmVkMTQ4X0ludGVybmFsU3RyYXRlZ3lEU0xfZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgogICAgICAgICB9IGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKICAgICAgICAgfQpAQCAtNjkwODEsMjAgKzY5MTI3LDIwIEBACiAgICAgcHJvdGVjdGVkIERGQTEzNiBkZmExMzYgPSBuZXcgREZBMTM2KHRoaXMpOwogICAgIHByb3RlY3RlZCBERkExMzkgZGZhMTM5ID0gbmV3IERGQTEzOSh0aGlzKTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xcyA9ICJcMTBcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzJzID0gIlwyXHVmZmZmXDFcNVwzXHVmZmZmXDFcNVwxXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zcyA9ICJcMVw0XDFcdWZmZmZcMVw1M1wxXHVmZmZmXDFcNFwxXHVmZmZmXDFcNTNcMVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNHMgPSAiXDFcMTUxXDFcdWZmZmZcMVwxMTRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxMTRcMVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNXMgPSAiXDFcdWZmZmZcMVwxXDFcdWZmZmZcMVw0XDFcdWZmZmZcMVwyXDFcdWZmZmZcMVwzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8ycyA9ICJcMlx1ZmZmZlwxXDVcNFx1ZmZmZlwxXDUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzNzID0gIlwxXDRcMVx1ZmZmZlwxXDUzXDFcdWZmZmZcMVw0XDJcdWZmZmZcMVw1MyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNHMgPSAiXDFcMTUyXDFcdWZmZmZcMVwxMTVcMVx1ZmZmZlwxXDQ0XDJcdWZmZmZcMVwxMTUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzVzID0gIlwxXHVmZmZmXDFcMVwxXHVmZmZmXDFcNFwxXHVmZmZmXDFcMlwxXDNcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNnMgPSAiXDEwXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfN3MgPSB7Ci0gICAgICAgICAgICAiXDFcMlw1MVx1ZmZmZlwxXDFcNzJcdWZmZmZcMVwzIiwKKyAgICAgICAgICAgICJcMVwyXDUxXHVmZmZmXDFcMVw3M1x1ZmZmZlwxXDMiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcNFwzXHVmZmZmXDFcNVwxM1x1ZmZmZlwxXDVcMjBcdWZmZmZcMVw1IiwKKyAgICAgICAgICAgICJcMVw0XDNcdWZmZmZcMVw1XDE0XHVmZmZmXDFcNVwyMFx1ZmZmZlwxXDUiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcNlwzN1x1ZmZmZlwxXDciLAorICAgICAgICAgICAgIlwxXDdcMzdcdWZmZmZcMVw2IiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXDRcM1x1ZmZmZlwxXDVcMTNcdWZmZmZcMVw1XDIwXHVmZmZmXDFcNSIsCi0gICAgICAgICAgICAiIgorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNFwzXHVmZmZmXDFcNVwxNFx1ZmZmZlwxXDVcMjBcdWZmZmZcMVw1IgogICAgIH07CiAKICAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBkZmFfMSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGRmYV8xcyk7CkBAIC02OTEyNCwxMSArNjkxNzAsMTEgQEAKICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfOHMgPSAiXDQzXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV85cyA9ICJcMVw0XDFcMFw0MVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTBzID0gIlwxXDE1NlwxXDBcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzEwcyA9ICJcMVwxNTdcMVwwXDQxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8xMXMgPSAiXDJcdWZmZmZcMVwyXDM3XHVmZmZmXDFcMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMTJzID0gIlwxXHVmZmZmXDFcMFw0MVx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzEzcyA9IHsKLSAgICAgICAgICAgICJcMVwxXDRcMlwyMlx1ZmZmZlwxXDJcNlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMTFcdWZmZmZcMVwyXDIwXHVmZmZmXDJcMlwzXHVmZmZmXDJcMlwyXHVmZmZmXDFcMlwxXHVmZmZmXDFcMlwyXHVmZmZmXDExXDJcMVx1ZmZmZlwxXDJcMTBcdWZmZmZcMVwyIiwKKyAgICAgICAgICAgICJcMVwxXDRcMlwyMlx1ZmZmZlwxXDJcNlx1ZmZmZlwyXDJcNFx1ZmZmZlwxXDJcNFx1ZmZmZlw2XDJcMTJcdWZmZmZcMVwyXDIwXHVmZmZmXDJcMlwzXHVmZmZmXDJcMlwyXHVmZmZmXDFcMlwxXHVmZmZmXDFcMlwyXHVmZmZmXDExXDJcMVx1ZmZmZlwxXDJcMTBcdWZmZmZcMVwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtNjkyMTYsNyArNjkyNjIsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfMTRzID0gewotICAgICAgICAgICAgIlw1XDJcMjJcdWZmZmZcMVwyXDZcdWZmZmZcMlwyXDRcdWZmZmZcMVwyXDRcdWZmZmZcNlwyXDExXHVmZmZmXDFcMlwyMFx1ZmZmZlwyXDJcM1x1ZmZmZlwxXDFcMVwyXDJcdWZmZmZcMVwyXDFcdWZmZmZcMVwyXDJcdWZmZmZcMTFcMlwxXHVmZmZmXDFcMlwxMFx1ZmZmZlwxXDIiLAorICAgICAgICAgICAgIlw1XDJcMjJcdWZmZmZcMVwyXDZcdWZmZmZcMlwyXDRcdWZmZmZcMVwyXDRcdWZmZmZcNlwyXDEyXHVmZmZmXDFcMlwyMFx1ZmZmZlwyXDJcM1x1ZmZmZlwxXDFcMVwyXDJcdWZmZmZcMVwyXDFcdWZmZmZcMVwyXDJcdWZmZmZcMTFcMlwxXHVmZmZmXDFcMlwxMFx1ZmZmZlwxXDIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCkBAIC02OTM4NywxOSArNjk0MzMsMTkgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yMXMgPSAiXDEyXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yMnMgPSAiXDRcdWZmZmZcNVwzXDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzIzcyA9ICJcMVw1M1wyXDRcMVx1ZmZmZlw1XDRcMVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjRzID0gIlwxXDE1M1wyXDYxXDFcdWZmZmZcNVwxNTZcMVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjRzID0gIlwxXDE1NFwyXDYxXDFcdWZmZmZcNVwxNTdcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjVzID0gIlwzXHVmZmZmXDFcMlw1XHVmZmZmXDFcMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMjZzID0gIlwxMlx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzI3cyA9IHsKLSAgICAgICAgICAgICJcMVwxXDc2XHVmZmZmXDFcMlwxXDMiLAorICAgICAgICAgICAgIlwxXDFcNzdcdWZmZmZcMVwyXDFcMyIsCiAgICAgICAgICAgICAiXDFcNFwyNlx1ZmZmZlwxXDNcMjFcdWZmZmZcMVw1XDFcNlwxXDdcMVwxMFwxXDMiLAogICAgICAgICAgICAgIlwxXDRcMjZcdWZmZmZcMVwzXDIxXHVmZmZmXDFcNVwxXDZcMVw3XDFcMTBcMVwzIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTFcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAotICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTFcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAotICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTFcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAotICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTFcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAotICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTFcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTJcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTJcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTJcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTJcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAorICAgICAgICAgICAgIlw1XDNcNFx1ZmZmZlwxXDExXDQ1XDNcMTJcdWZmZmZcMlwzXDEzXHVmZmZmXDFcM1wyXHVmZmZmXDFcM1wxXHVmZmZmXDMxXDNcM1x1ZmZmZlwyXDNcMVx1ZmZmZlwyXDMiLAogICAgICAgICAgICAgIiIKICAgICB9OwogCkBAIC02OTQyOSwxMSArNjk0NzUsMTEgQEAKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yOHMgPSAiXDFcNFwyXDBcNDBcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzI5cyA9ICJcMVwxNTZcMlwwXDQwXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8yOXMgPSAiXDFcMTU3XDJcMFw0MFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzBzID0gIlwzXHVmZmZmXDFcMVwxXHVmZmZmXDFcMlwzNVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzFzID0gIlwxXHVmZmZmXDFcMFwxXDFcNDBcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV8zMnMgPSB7Ci0gICAgICAgICAgICAiXDFcMVw0XDVcMjJcdWZmZmZcMVw1XDNcdWZmZmZcMVwzXDJcdWZmZmZcMlw1XDRcdWZmZmZcMVw1XDRcdWZmZmZcNlw1XDExXHVmZmZmXDFcNVwyMVx1ZmZmZlwxXDJcM1x1ZmZmZlwyXDVcMlx1ZmZmZlwxXDVcMVx1ZmZmZlwxXDVcMlx1ZmZmZlwxMVw1XDFcdWZmZmZcMVw1XDZcdWZmZmZcMVwzXDFcdWZmZmZcMVw1IiwKKyAgICAgICAgICAgICJcMVwxXDRcNVwyMlx1ZmZmZlwxXDVcM1x1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDVcNFx1ZmZmZlw2XDVcMTJcdWZmZmZcMVw1XDIxXHVmZmZmXDFcMlwzXHVmZmZmXDJcNVwyXHVmZmZmXDFcNVwxXHVmZmZmXDFcNVwyXHVmZmZmXDExXDVcMVx1ZmZmZlwxXDVcNlx1ZmZmZlwxXDNcMVx1ZmZmZlwxXDUiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTY5NTM1LDExICs2OTU4MSwxMSBAQAogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zM3MgPSAiXDQwXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zNHMgPSAiXDFcNFwyNlx1ZmZmZlwxXDBcMTBcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzM1cyA9ICJcMVwxNTZcMjZcdWZmZmZcMVwwXDEwXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zNXMgPSAiXDFcMTU3XDI2XHVmZmZmXDFcMFwxMFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfMzZzID0gIlwxXHVmZmZmXDFcMVwxXDJcMVwzXDFcNFwxXDVcNlx1ZmZmZlwxXDZcMTFcdWZmZmZcMVw3XDFcdWZmZmZcMVwxMlwxXDEzXDFcMTRcMVwxNVwxXDE2XDFcMTdcMVwxMFwxXDExIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV8zN3MgPSAiXDI3XHVmZmZmXDFcMFwxMFx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzM4cyA9IHsKLSAgICAgICAgICAgICJcMVw1XDRcMTRcMjJcdWZmZmZcMVw1XDIxXHVmZmZmXDVcNVwxXDE0XDExXHVmZmZmXDFcMlwyMVx1ZmZmZlwxXDM1XDNcdWZmZmZcMlwxNFwyXHVmZmZmXDFcMjZcMVx1ZmZmZlwxXDNcMlx1ZmZmZlwxXDI3XDFcMzBcMVwzMVwxXDFcMlwxNFwxXDMyXDFcMzNcMVwzNFwxXHVmZmZmXDFcNFwxMFx1ZmZmZlwxXDE0IiwKKyAgICAgICAgICAgICJcMVw1XDRcMTRcMjJcdWZmZmZcMVw1XDIxXHVmZmZmXDVcNVwxXDE0XDEyXHVmZmZmXDFcMlwyMVx1ZmZmZlwxXDM1XDNcdWZmZmZcMlwxNFwyXHVmZmZmXDFcMjZcMVx1ZmZmZlwxXDNcMlx1ZmZmZlwxXDI3XDFcMzBcMVwzMVwxXDFcMlwxNFwxXDMyXDFcMzNcMVwzNFwxXHVmZmZmXDFcNFwxMFx1ZmZmZlwxXDE0IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTY5NjI0LDcgKzY5NjcwLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzM5cyA9IHsKLSAgICAgICAgICAgICJcNVwyXDIyXHVmZmZmXDFcMlwzXHVmZmZmXDFcMlwyXHVmZmZmXDJcMlw0XHVmZmZmXDFcMlw0XHVmZmZmXDZcMlwxMVx1ZmZmZlwxXDJcMjFcdWZmZmZcMVwxXDNcdWZmZmZcMlwyXDJcdWZmZmZcMVwyXDFcdWZmZmZcMVwyXDJcdWZmZmZcMTFcMlwxXHVmZmZmXDFcMlwxMFx1ZmZmZlwxXDIiLAorICAgICAgICAgICAgIlw1XDJcMjJcdWZmZmZcMVwyXDNcdWZmZmZcMVwyXDJcdWZmZmZcMlwyXDRcdWZmZmZcMVwyXDRcdWZmZmZcNlwyXDEyXHVmZmZmXDFcMlwyMVx1ZmZmZlwxXDFcM1x1ZmZmZlwyXDJcMlx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDJcMlx1ZmZmZlwxMVwyXDFcdWZmZmZcMVwyXDEwXHVmZmZmXDFcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTY5ODI1LDExICs2OTg3MSwxMSBAQAogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80MHMgPSAiXDFcMTBcMTFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQxcyA9ICJcMVw0XDdcMFwyXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80MnMgPSAiXDFcMTU2XDdcMFwyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80MnMgPSAiXDFcMTU3XDdcMFwyXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80M3MgPSAiXDEwXHVmZmZmXDFcMlwxXDEiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQ0cyA9ICJcMVx1ZmZmZlwxXDJcMVwxXDFcMFwxXDZcMVwzXDFcNFwxXDVcMlx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80NHMgPSAiXDFcdWZmZmZcMVwyXDFcMFwxXDZcMVw0XDFcM1wxXDFcMVw1XDJcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV80NXMgPSB7Ci0gICAgICAgICAgICAiXDVcMTBcNVx1ZmZmZlwyXDEwXDFcMVwxXDJcMVwzXDFcNFwxXDVcNVwxMFwxXDdcMVw2XDI3XDEwXDExXHVmZmZmXDJcMTBcMTNcdWZmZmZcMVwxMFwyXHVmZmZmXDFcMTBcMVx1ZmZmZlwzMVwxMFwzXHVmZmZmXDJcMTBcMVx1ZmZmZlwyXDEwIiwKKyAgICAgICAgICAgICJcNVwxMFw1XHVmZmZmXDJcMTBcMVwxXDFcMlwxXDNcMVw0XDFcNVw1XDEwXDFcN1wxXDZcMjdcMTBcMTJcdWZmZmZcMlwxMFwxM1x1ZmZmZlwxXDEwXDJcdWZmZmZcMVwxMFwxXHVmZmZmXDMxXDEwXDNcdWZmZmZcMlwxMFwxXHVmZmZmXDJcMTAiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLApAQCAtNjk4NjEsMzUgKzY5OTA3LDIwIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNDU7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiNjgxMDoyOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICI2ODE2OjI6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzBfMyA9IGlucHV0LkxBKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3MF8zID0gaW5wdXQuaW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExOF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA5O30KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3MF8zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzBfMiA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3MF8yID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExOF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA5O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMTlfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gOTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQogCkBAIC02OTg5Nyw2ICs2OTkyOCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDcwXzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3MF82ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDcwXzYgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTE5X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDcwXzYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3MF8xID0gaW5wdXQuTEEoMSk7CiAKQEAgLTY5OTA0LDcgKzY5OTUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDcwXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTE4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExOV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA5O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKQEAgLTY5OTE5LDcgKzY5OTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDcwXzUgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTE4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExOV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA5O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKQEAgLTY5OTI4LDE4ICs2OTk3NCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IDogCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3MF82ID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3MF80ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDcwXzYgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzBfNCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMThfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gOTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTE5X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDk7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA4O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDcwXzYpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDcwXzQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSA1IDogCkBAIC02OTk0OSw3ICs2OTk5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3MF83ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExOF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA5O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMTlfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gOTt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDg7fQogCkBAIC02OTk1OCwxOCArNzAwMDQsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzBfNCA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzBfMyA9IGlucHV0LkxBKDEpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3MF80ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDcwXzMgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTE4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDk7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExOV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA5O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gODt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3MF80KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3MF8zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02OTk4MiwxMSArNzAwMjgsMTEgQEAKICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNDZzID0gIlwxXDFcMTJcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzQ3cyA9ICJcMVw0XDFcdWZmZmZcMTBcMFwxXHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80OHMgPSAiXDFcMTU2XDFcdWZmZmZcMTBcMFwxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80OHMgPSAiXDFcMTU3XDFcdWZmZmZcMTBcMFwxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV80OXMgPSAiXDFcdWZmZmZcMVwyXDEwXHVmZmZmXDFcMSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNTBzID0gIlwyXHVmZmZmXDFcMlwxXDBcMVwxXDFcNlwxXDVcMVw0XDFcM1wxXDdcMVx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81MHMgPSAiXDJcdWZmZmZcMVwwXDFcNVwxXDNcMVwxXDFcN1wxXDRcMVw2XDFcMlwxXHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNTFzID0gewotICAgICAgICAgICAgIlw1XDFcNVx1ZmZmZlwxNFwxXDFcM1wxXDJcMVw0XDFcNVwxXDZcMVw3XDFcMTBcMVwxMVwyMVwxXDExXHVmZmZmXDJcMVwxM1x1ZmZmZlwxXDFcMlx1ZmZmZlwxXDFcMVx1ZmZmZlwzMVwxXDNcdWZmZmZcMlwxXDFcdWZmZmZcMlwxIiwKKyAgICAgICAgICAgICJcNVwxXDVcdWZmZmZcMTRcMVwxXDNcMVwyXDFcNFwxXDVcMVw2XDFcN1wxXDEwXDFcMTFcMjFcMVwxMlx1ZmZmZlwyXDFcMTNcdWZmZmZcMVwxXDJcdWZmZmZcMVwxXDFcdWZmZmZcMzFcMVwzXHVmZmZmXDJcMVwxXHVmZmZmXDJcMSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLApAQCAtNzAwMTksNTAgKzcwMDY1LDIwIEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNTE7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiKCkqIGxvb3BiYWNrIG9mIDgxMDY6MjogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAgKSoiOworICAgICAgICAgICAgcmV0dXJuICIoKSogbG9vcGJhY2sgb2YgODExMjoyOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCApKiI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwogICAgICAgICAJaW50IF9zID0gczsKICAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzZfMyA9IGlucHV0LkxBKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3Nl8zID0gaW5wdXQuaW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAxMDt9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzQgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfNCA9IGlucHV0LmluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KLQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl8yID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDc2XzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI0X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDEwO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIApAQCAtNzAwNzAsMTkgKzcwMDg2LDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzggPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl81ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDc2XzggPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfNSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAxMDt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzkgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfOSA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl80ID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDc2XzQgPSBpbnB1dC5pbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3Nl80KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IApAQCAtNzAwOTIsNyArNzAxMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfNyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAxMDt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQogCkBAIC03MDEwMSwxMyArNzAxNDcsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgNSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzZfMyA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3Nl8zID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDYgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzggPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfOCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3IDogCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3Nl82ID0gaW5wdXQuTEEoMSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDc2XzYgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI0X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDEwO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KIApAQCAtNzAxMTUsMzYgKzcwMTkxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlZWsoaW5kZXg3Nl82KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNzZfNSA9IGlucHV0LkxBKDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg3Nl81ID0gaW5wdXQuaW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyNF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAxMDt9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDE7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZWVrKGluZGV4NzZfNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDcgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTc2XzkgPSBpbnB1dC5MQSgxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4NzZfOSA9IGlucHV0LmluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMTA7fQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAxO30KLQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VlayhpbmRleDc2XzkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQogICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CkBAIC03MDE1NiwxMSArNzAyMDIsMTEgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81MnMgPSAiXDExNlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNTNzID0gIlwxXDJcMTE1XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81NHMgPSAiXDFcNFwxXDBcMTE0XHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81NXMgPSAiXDFcMTU2XDFcMFwxMTRcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzU1cyA9ICJcMVwxNTdcMVwwXDExNFx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNTZzID0gIlwyXHVmZmZmXDFcMlwxMTJcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV81N3MgPSAiXDFcdWZmZmZcMVwwXDExNFx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzU4cyA9IHsKLSAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcNDVcMlwxMVx1ZmZmZlwyXDJcMTNcdWZmZmZcMVwyXDJcdWZmZmZcMVwyXDFcdWZmZmZcMVwxXDMwXDJcM1x1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAorICAgICAgICAgICAgIlw1XDJcNVx1ZmZmZlw0NVwyXDEyXHVmZmZmXDJcMlwxM1x1ZmZmZlwxXDJcMlx1ZmZmZlwxXDJcMVx1ZmZmZlwxXDFcMzBcMlwzXHVmZmZmXDJcMlwxXHVmZmZmXDJcMiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKQEAgLTcwMjYyLDcgKzcwMzA4LDcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81ODsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICI5NzAwOjI6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjk3MDY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CkBAIC03MDI3NSw3ICs3MDMyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg4M18xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzMV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTMyX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKQEAgLTcwMjkyLDcgKzcwMzM4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzU5cyA9IHsKLSAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcNDVcMlwxMVx1ZmZmZlwyXDJcMTNcdWZmZmZcMVwyXDJcdWZmZmZcMVwyXDFcdWZmZmZcNVwyXDFcMVwyM1wyXDNcdWZmZmZcMlwyXDFcdWZmZmZcMlwyIiwKKyAgICAgICAgICAgICJcNVwyXDVcdWZmZmZcNDVcMlwxMlx1ZmZmZlwyXDJcMTNcdWZmZmZcMVwyXDJcdWZmZmZcMVwyXDFcdWZmZmZcNVwyXDFcMVwyM1wyXDNcdWZmZmZcMlwyXDFcdWZmZmZcMlwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtNzAzODcsNyArNzA0MzMsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzU5OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjk3MjY6MjogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV80ICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiOTczMjoyOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKQEAgLTcwNDAwLDcgKzcwNDQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDg0XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTMyX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMzNfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIApAQCAtNzA0MTgsMTEgKzcwNDY0LDExIEBACiAgICAgfQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzYwcyA9ICJcNDZcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzYxcyA9ICJcMVw0XDJcMFw0M1x1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNjJzID0gIlwxXDE1NlwyXDBcNDNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzYycyA9ICJcMVwxNTdcMlwwXDQzXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82M3MgPSAiXDNcdWZmZmZcMVwxXDFcdWZmZmZcMVwyXDQwXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82NHMgPSAiXDFcdWZmZmZcMVwwXDFcMVw0M1x1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzY1cyA9IHsKLSAgICAgICAgICAgICJcMVwxXDRcNVwyMlx1ZmZmZlwxXDVcM1x1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDVcM1x1ZmZmZlw3XDVcMTFcdWZmZmZcMVw1XDIxXHVmZmZmXDFcMlwyXHVmZmZmXDNcNVwyXHVmZmZmXDFcNVwxXHVmZmZmXDFcNVwyXHVmZmZmXDExXDVcMVx1ZmZmZlwxXDVcNlx1ZmZmZlwxXDNcMlw1IiwKKyAgICAgICAgICAgICJcMVwxXDRcNVwyMlx1ZmZmZlwxXDVcM1x1ZmZmZlwxXDNcMlx1ZmZmZlwyXDVcNFx1ZmZmZlwxXDVcM1x1ZmZmZlw3XDVcMTJcdWZmZmZcMVw1XDIxXHVmZmZmXDFcMlwyXHVmZmZmXDNcNVwyXHVmZmZmXDFcNVwxXHVmZmZmXDFcNVwyXHVmZmZmXDExXDVcMVx1ZmZmZlwxXDVcNlx1ZmZmZlwxXDNcMlw1IiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLAogICAgICAgICAgICAgIiIsCkBAIC03MDQ4Myw3ICs3MDUyOSw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNjU7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTA2OTk6MjogKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjEwNzA1OjI6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKQEAgLTcwNDk2LDcgKzcwNTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDkyXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTQwX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE0MV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CiAKQEAgLTcwNTExLDcgKzcwNTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDkyXzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTQwX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE0MV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNTt9CiAKQEAgLTcwNTI5LDExICs3MDU3NSwxMSBAQAogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82NnMgPSAiXDQyXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82N3MgPSAiXDFcNFwyXDBcMzdcdWZmZmYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzY4cyA9ICJcMVwxNTZcMlwwXDM3XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV82OHMgPSAiXDFcMTU3XDJcMFwzN1x1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNjlzID0gIlwzXHVmZmZmXDFcMVwxXDJcMzVcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzcwcyA9ICJcMVx1ZmZmZlwxXDBcMVwxXDM3XHVmZmZmfT4iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBkZmFfNzFzID0gewotICAgICAgICAgICAgIlwxXDFcNFw0XDIyXHVmZmZmXDFcNFwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNFw0XHVmZmZmXDFcNFw0XHVmZmZmXDZcNFwxMVx1ZmZmZlwxXDRcMjFcdWZmZmZcMVwyXDNcdWZmZmZcMlw0XDJcdWZmZmZcMVw0XDFcdWZmZmZcMVw0XDJcdWZmZmZcMTFcNFwxXHVmZmZmXDFcNFwxMFx1ZmZmZlwxXDQiLAorICAgICAgICAgICAgIlwxXDFcNFw0XDIyXHVmZmZmXDFcNFwzXHVmZmZmXDFcM1wyXHVmZmZmXDJcNFw0XHVmZmZmXDFcNFw0XHVmZmZmXDZcNFwxMlx1ZmZmZlwxXDRcMjFcdWZmZmZcMVwyXDNcdWZmZmZcMlw0XDJcdWZmZmZcMVw0XDFcdWZmZmZcMVw0XDJcdWZmZmZcMTFcNFwxXHVmZmZmXDFcNFwxMFx1ZmZmZlwxXDQiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKQEAgLTcwNTkwLDcgKzcwNjM2LDcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV83MTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIxMjEzMDoyOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjEyMTM2OjI6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV8wX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CkBAIC03MDYwMyw3ICs3MDY0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMDJfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNTBfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gMzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTUxX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDM7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSA0O30KIApAQCAtNzA2MTgsNyArNzA2NjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTAyXzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTUwX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDM7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE1MV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSAzO30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gNDt9CiAKQEAgLTcwNjQ5LDcgKzcwNjk1LDcgQEAKICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IGRmYV81ODsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICIxNDI2MzoyOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjE0MjY5OjI6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CkBAIC03MDY2Miw3ICs3MDcwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTVfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjNfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2NF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCkBAIC03MDY5Myw3ICs3MDczOSw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfNTk7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTQyODk6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiMTQyOTU6MjogKCBydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80ICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CkBAIC03MDcwNiw3ICs3MDc1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMTZfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE2NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCkBAIC03MDcyMyw3ICs3MDc2OSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV83MnMgPSB7Ci0gICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDE1XDJcMVwxXDI3XDJcMTFcdWZmZmZcMlwyXDEzXHVmZmZmXDFcMlwyXHVmZmZmXDFcMlwxXHVmZmZmXDMxXDJcM1x1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAorICAgICAgICAgICAgIlw1XDJcNVx1ZmZmZlwxNVwyXDFcMVwyN1wyXDEyXHVmZmZmXDJcMlwxM1x1ZmZmZlwxXDJcMlx1ZmZmZlwxXDJcMVx1ZmZmZlwzMVwyXDNcdWZmZmZcMlwyXDFcdWZmZmZcMlwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtNzA4MTgsNyArNzA4NjQsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzcyOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE0NzQ5OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjE0NzU1OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwpAQCAtNzA4MzEsNyArNzA4NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTIwXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTY4X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNjlfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIApAQCAtNzA4NjIsNyArNzA5MDgsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzU4OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE0Nzc2OjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyI7CisgICAgICAgICAgICByZXR1cm4gIjE0NzgyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwpAQCAtNzA4NzUsNyArNzA5MjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTIxXzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTY5X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzBfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIApAQCAtNzA5MDYsNyArNzA5NTIsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzU5OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE0ODAyOjI6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81ICk/IjsKKyAgICAgICAgICAgIHJldHVybiAiMTQ4MDg6MjogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzUgKT8iOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIFRva2VuU3RyZWFtIGlucHV0ID0gKFRva2VuU3RyZWFtKV9pbnB1dDsKQEAgLTcwOTE5LDcgKzcwOTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyMl8xID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3MF9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTcxX0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMjt9CiAKQEAgLTcwOTM3LDExICs3MDk4MywxMSBAQAogICAgIH0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83M3MgPSAiXDFcNDFcMTE1XHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83NHMgPSAiXDFcNFw0MFwwXDU1XHVmZmZmIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83NXMgPSAiXDFcMTU2XDQwXDBcNTVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzc1cyA9ICJcMVwxNTdcNDBcMFw1NVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNzZzID0gIlw0MVx1ZmZmZlwxXDJcNTNcdWZmZmZcMVwxIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV83N3MgPSAiXDFcdWZmZmZcMVwwXDFcMVwxXDJcMVwzXDFcNFwxXDVcMVw2XDFcN1wxXDEwXDFcMTFcMVwxMlwxXDEzXDFcMTRcMVwxNVwxXDE2XDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0XDFcMjVcMVwyNlwxXDI3XDFcMzBcMVwzMVwxXDMyXDFcMzNcMVwzNFwxXDM1XDFcMzZcMVwzN1w1NVx1ZmZmZn0+IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGZhXzc4cyA9IHsKLSAgICAgICAgICAgICJcMVwxXDFcMjNcMVwyNFwxXDI1XDFcMjdcNVx1ZmZmZlwxNVw0MVwxXDE1XDZcNDFcMVwxMFwxXDdcNFw0MVwxXDZcNFw0MVwxXDJcMVwzXDFcNFwxXDVcMVwxNlwxXDIxXDExXHVmZmZmXDFcMTJcMVw0MVwxM1x1ZmZmZlwxXDQxXDJcdWZmZmZcMVw0MVwxXHVmZmZmXDFcNDBcM1w0MVwxXDE3XDFcMjBcMlw0MVwxXDMxXDFcNDFcMVwxM1wyXDQxXDFcMzJcMVwzM1wxXDM0XDFcMTFcMVwyNlwxXDMwXDFcMzVcMVwzNlwxXDM3XDFcNDFcMVwxNFwxXDQxXDNcdWZmZmZcMlw0MVwxXHVmZmZmXDFcNDFcMVwyMiIsCisgICAgICAgICAgICAiXDFcMVwxXDIzXDFcMjRcMVwyNVwxXDI3XDVcdWZmZmZcMTVcNDFcMVwxNVw2XDQxXDFcMTBcMVw3XDRcNDFcMVw2XDRcNDFcMVwyXDFcM1wxXDRcMVw1XDFcMTZcMVwyMVwxMlx1ZmZmZlwxXDEyXDFcNDFcMTNcdWZmZmZcMVw0MVwyXHVmZmZmXDFcNDFcMVx1ZmZmZlwxXDQwXDNcNDFcMVwxN1wxXDIwXDJcNDFcMVwzMVwxXDQxXDFcMTNcMlw0MVwxXDMyXDFcMzNcMVwzNFwxXDExXDFcMjZcMVwzMFwxXDM1XDFcMzZcMVwzN1wxXDQxXDFcMTRcMVw0MVwzXHVmZmZmXDJcNDFcMVx1ZmZmZlwxXDQxXDFcMjIiLAogICAgICAgICAgICAgIlwxXHVmZmZmIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiXDFcdWZmZmYiLApAQCAtNzEwNDEsNyArNzEwODcsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzc4OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE1NjkzOjI6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxNTY5OToyOiAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CkBAIC03MTA1NCw3ICs3MTEwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzEwNjksNyArNzExMTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMDg0LDcgKzcxMTMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18zID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTA5OSw3ICs3MTE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfNCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzExMTQsNyArNzExNjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzUgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMTI5LDcgKzcxMTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN182ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTE0NCw3ICs3MTE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfNyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzExNTksNyArNzEyMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzggPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMTc0LDcgKzcxMjIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN185ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTE4OSw3ICs3MTIzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMTAgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMjA0LDcgKzcxMjUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18xMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzEyMTksNyArNzEyNjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzEyID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTIzNCw3ICs3MTI4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMTMgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMjQ5LDcgKzcxMjk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18xNCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzEyNjQsNyArNzEzMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzE1ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTI3OSw3ICs3MTMyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMTYgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMjk0LDcgKzcxMzQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18xNyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzEzMDksNyArNzEzNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzE4ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTMyNCw3ICs3MTM3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMTkgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMzM5LDcgKzcxMzg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18yMCA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzEzNTQsNyArNzE0MDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzIxID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTM2OSw3ICs3MTQxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMjIgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxMzg0LDcgKzcxNDMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18yMyA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzEzOTksNyArNzE0NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzI0ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTQxNCw3ICs3MTQ2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMjUgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxNDI5LDcgKzcxNDc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18yNiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzE0NDQsNyArNzE0OTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzI3ID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTQ1OSw3ICs3MTUwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMjggPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxNDc0LDcgKzcxNTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18yOSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzE0ODksNyArNzE1MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTI3XzMwID0gaW5wdXQuaW5kZXgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc2X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KIAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICh0cnVlKSApIHtzID0gMzM7fQogCkBAIC03MTUwNCw3ICs3MTU1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMjdfMzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTc1X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc3O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzZfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAzMzt9CiAKQEAgLTcxNTE5LDcgKzcxNTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEyN18zMiA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNzVfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzc7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE3Nl9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3Nzt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDMzO30KIApAQCAtNzE1MzgsMTEgKzcxNTg0LDExIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfNzlzID0gIlwxMTdcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzgwcyA9ICJcMVwyXDExNlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODFzID0gIlwxXDRcMVwwXDExNVx1ZmZmZiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODJzID0gIlwxXDE1NlwxXDBcMTE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRmYV84MnMgPSAiXDFcMTU3XDFcMFwxMTVcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGZhXzgzcyA9ICJcMlx1ZmZmZlwxXDJcMTEzXHVmZmZmXDFcMSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZmFfODRzID0gIlwxXHVmZmZmXDFcMFwxMTVcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRmYV84NXMgPSB7Ci0gICAgICAgICAgICAiXDVcMlw1XHVmZmZmXDE1XDJcMVwxXDI3XDJcMTFcdWZmZmZcMlwyXDEzXHVmZmZmXDFcMlwyXHVmZmZmXDFcMlwxXHVmZmZmXDMxXDJcMVx1ZmZmZlwxXDJcMVx1ZmZmZlwyXDJcMVx1ZmZmZlwyXDIiLAorICAgICAgICAgICAgIlw1XDJcNVx1ZmZmZlwxNVwyXDFcMVwyN1wyXDEyXHVmZmZmXDJcMlwxM1x1ZmZmZlwxXDJcMlx1ZmZmZlwxXDJcMVx1ZmZmZlwzMVwyXDFcdWZmZmZcMVwyXDFcdWZmZmZcMlwyXDFcdWZmZmZcMlwyIiwKICAgICAgICAgICAgICJcMVx1ZmZmZiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLApAQCAtNzE2NDUsNyArNzE2OTEsNyBAQAogICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gZGZhXzg1OwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE3MDUwOjI6ICggcnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxNzA1NjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wICk/IjsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBUb2tlblN0cmVhbSBpbnB1dCA9IChUb2tlblN0cmVhbSlfaW5wdXQ7CkBAIC03MTY1OCw3ICs3MTcwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxMzZfMSA9IGlucHV0LmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxODRfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzg7fQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE4NV9JbnRlcm5hbFN0cmF0ZWd5RFNMKCkpICkge3MgPSA3ODt9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7cyA9IDI7fQogCkBAIC03MTY4OSw3ICs3MTczNSw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBkZmFfODU7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiAiMTczMjA6MjogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAgKT8iOworICAgICAgICAgICAgcmV0dXJuICIxNzMyNjoyOiAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCApPyI7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24gewogICAgICAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OwpAQCAtNzE3MDIsNyArNzE3NDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MTM5XzEgPSBpbnB1dC5pbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTg3X0ludGVybmFsU3RyYXRlZ3lEU0woKSkgKSB7cyA9IDc4O30KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxODhfSW50ZXJuYWxTdHJhdGVneURTTCgpKSApIHtzID0gNzg7fQogCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkge3MgPSAyO30KIApAQCAtNzE3MjQsNDcgKzcxNzcwLDQ3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDgwMDAwMDAwMDAwMkx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMTJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwODAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDgwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEwMDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgxMDAwMDAwMDAwMDAwMDAyTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEwMDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHg0MDAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDIwMDAwMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4ODAwMDAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAyMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMTA1TH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDAwMUx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMDRMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMTAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMUx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDJMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDFGODAwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDRMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDA4TH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwNjAwMDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAyMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwNDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDgwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDIwMDAwMDAwMDAwMDAwMTBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMTAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDA4MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgyMDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4ODAwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHg0MDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMUx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDA0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4NDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMjBBTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDAwMjAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDNGODAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMDEwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDAyMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwQzAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDA0MEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDAwODBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4NDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMTAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDQwMDAwMDAwMDAwMDAwMTBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAwMjAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMDgwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDEwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDgwMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwNDAwMDAwMDAwMDEwTCwweDAwMDAwMjAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzMzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDAxMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDA0MDAwMDAwMDAwMTBMLDB4MDAwMDA0MDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDIwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMTAwMDAwMDAwMDAxMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAxMDAwMDAwMDEwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwMjAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDQwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MTAwN0UxMEMwODAwMDFGMEwsMHgwMDAwNDAyRkY5NENFMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAxMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMTAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MTAwN0UxMEMwODAwMDFGMEwsMHgwMDAwNDAyRkY5NEM2MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAwNDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzM4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwN0UxMEMwODAwMDFGMEwsMHgwMDAwODA1RkYyOTlDMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18zOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDAyMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAwMjAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwN0UxMEMwODAwMDFGMEwsMHgwMDAwODA1RkYyOThDMDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDIwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MTAwN0UxMEMwODAwMDFGMEwsMHgwMDAwNDAyRkY5NEU2MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDA0MDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwODAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwN0UxMEMwODAwMDFGMEwsMHgwMDAwODA1RkYyOUNDMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDA4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAxMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzQ2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMUUwMDAwMDAwMDAxMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNDcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDBDMUYwMDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV180OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDgwMDAwMDBMfSk7CkBAIC03MTc3NSwxMCArNzE4MjEsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDA4MDAyTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDFFMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMUUwMDAwMkx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDBFMDAwMDAwTCwweDAwMDAwMDAwMDAxMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwRTAwMDAwMkwsMHgwMDAwMDAwMDAwMTAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMTBMLDB4MDAwMDAwMDAwMDAwNDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAxMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwRTAwMDAwMEwsMHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV181NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMEUwMDAwMDJMLDB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDEwTCwweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzU5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMjAwMDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAzRkMwMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzYxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDNGQzAwMDAwMkx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDQwMDAwMDAwTH0pOwpAQCAtNzE3ODksNjIgKzcxODM1LDYyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzY3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwRjAwMDAwMDAwMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDBGMDAwMDAwMDAyTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV182OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMTBDMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMjAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDA0MDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzcxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwNjAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzczID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMEwsMHgwMDAwMEMwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwODAwMDAwMDAwMDJMLDB4MDAwMDBDMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDgwMDAwMDAwMDAwTCwweDAwMDAwNDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzczID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMEwsMHgwMDAwMTgwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwODAwMDAwMDAwMDJMLDB4MDAwMDE4MDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDgwMDAwMDAwMDAwTCwweDAwMDAwODAwMDAwMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwM0UwMDAwODAwMDAxMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwODQwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAxMEwsMHgwMDAwMDA4MDAwMDA0MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDQwMDAwMDBMLDB4MDAwMDAwMDAwMDAxMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgxMDA3RTEwQzg4MDAwMUYwTCwweDAwMDA1MDJGRjk0Q0UwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MzAwN0UxMEMwODAwMDFGMEwsMHgwMDAwNDAyRkY5NEM2MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEwMDdGMTBDODgwMDAxRjBMLDB4MDAwMDcwMkZGOTRDNjAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMjAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAxMEwsMHgwMDAwMTAwMDAwMDA0MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEwMDdGMTBDMDgwMDAxRjJMLDB4MDAwMDYwMkZGOTRDNjAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDAwMDgwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwNDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDgwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDEwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MTAwN0UxMEM4ODAwMDFGMEwsMHgwMDAwNDAyRkY5NEM2MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDIwMDAwMDAwODAwMDAwMTBMLDB4MDAwMDAwMDAwNjAxNDIwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDEyTCwweDAwMDAwMDAwMDYwMTQwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAyMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMTBMLDB4MDAwMDAwMDAwNjAxNDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDgwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MTAwN0YxMEMwODAwMDFGMEwsMHgwMDAwNjAyRkY5NEM3MDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDEwMDdFMTBDMDgwMDAxRjBMLDB4MDAwMDQwMkZGOTRDNzAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgxMDA3RjEwQzA4MDAwMUYwTCwweDAwMDA2MDJGRjk0QzYwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDEwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMjAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDMwMDdGMTBDMDgwMDAxRjBMLDB4MDAwMDYwMkZGOTRDNjAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDEwMDAwMDAwMDAwMEwsMHgwMDAwMjAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwNDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDgwMDAwMDBMLDB4MDAwMDAwMDAwMDA4NDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwNDAwMDAwMDAwMDAwMEwsMHgwMDAwNDAwMDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwODAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzc3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMTA4MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV183OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMTBMLDB4MDAwMDAxMDAwMDAwODAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfNzkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDA0MDAwMDAwTCwweDAwMDAwMDAwMDAwMjAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwN0UxMEM4ODAwMDFGMEwsMHgwMDAwQTA1RkYyOTlDMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDYwMDdFMTBDMDgwMDAxRjBMLDB4MDAwMDgwNUZGMjk4QzAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgyMDA3RjEwQzg4MDAwMUYwTCwweDAwMDBFMDVGRjI5OEMwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzgzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDQwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwODAwMDAwMTBMLDB4MDAwMDIwMDAwMDAwODAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgyMDA3RjEwQzA4MDAwMUYyTCwweDAwMDBDMDVGRjI5OEMwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMDEwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV184NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDgwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAwMDEwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzg5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAyMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDIwMDdFMTBDODgwMDAxRjBMLDB4MDAwMDgwNUZGMjk4QzAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHg0MDAwMDAwMDgwMDAwMDEwTCwweDAwMDAwMDAwMEMwMjg0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzkyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAxMkwsMHgwMDAwMDAwMDBDMDI4MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwNDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDEwTCwweDAwMDAwMDAwMEMwMjgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDEwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDIwMDdGMTBDMDgwMDAxRjBMLDB4MDAwMEMwNUZGMjk4RTAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfOTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgyMDA3RTEwQzA4MDAwMUYwTCwweDAwMDA4MDVGRjI5OEUwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzk4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MjAwN0YxMEMwODAwMDFGMEwsMHgwMDAwQzA1RkYyOThDMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV185OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAyMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDQwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHg2MDA3RjEwQzA4MDAwMUYwTCwweDAwMDBDMDVGRjI5OEMwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAxMDAwMDAwMDAwMDBMLDB4MDAwMDQwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTAzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDgwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDA4MDAwMDAwTCwweDAwMDAwMDAwMDAxMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDAwMDBMLDB4MDAwMDgwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTA2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMTAwMDAwMDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMEUwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMTAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMDkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDA0MDAwMDAwMDAwMUUwTCwweDAwMDA0MDAxODAwQzAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDAwMDA4ODAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTExID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDAwMDAwMDgwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDAyMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDQwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwODAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDUwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMTAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDA0MDAwMDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDIwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEwOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDQwMDAwMDAwMDAxRTBMLDB4MDAwMDgwMDMwMDE4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwMDAwMTEwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDAwMDAxMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwMDQwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTEzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAwODAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMDEwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwQTAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEwsMHgwMDAwMDAyMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTCwweDAwMDAwMDgwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzExOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAwNDAwMDAwMDAwMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDA4MDAwMDAwMDAwMkx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDBDMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTIyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDA4MDAwMDAxMEwsMHgwMDAwMDAwMDAwMDBDMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDgwMDAwMDEwTCwweDAwMDAwMDAwMDAwMTgwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDIyMDAwMDAwMDAwMDBMfSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDAxMDAwMDAwMDAwMEx9KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkwsMHgwMDAwMDEwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMjQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAwMjAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEyNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMLDB4MDAwMDAyMDAwMDAwMDAwMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTI2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMTAwMDAwMDAwMEx9KTsKIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9TdHJhdGVneURTTElkZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL1N0cmF0ZWd5RFNMSWRlTW9kdWxlLmphdmEKaW5kZXggM2ZiYzczYi4uMGZjMDUwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL1N0cmF0ZWd5RFNMSWRlTW9kdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL1N0cmF0ZWd5RFNMSWRlTW9kdWxlLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGU7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9TdHJhdGVneURTTElkZVNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pZGUvU3RyYXRlZ3lEU0xJZGVTZXR1cC5qYXZhCmluZGV4IDlhNzgwMWYuLjg1MTZmZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuaWRlL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2lkZS9TdHJhdGVneURTTElkZVNldHVwLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pZGUvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaWRlL1N0cmF0ZWd5RFNMSWRlU2V0dXAuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LmlkZTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZGsvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9MSUNFTlNFLnR4dAppbmRleCBmZjQyYWQ0Li5mYzU5MzhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9MSUNFTlNFLnR4dAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9MSUNFTlNFLnR4dApAQCAtMSwxNjEgKzEsMTQwIEBACi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50CiAKLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgotT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCitOb3ZlbWJlciAyMiwgMjAxNwogCi0xLiBERUZJTklUSU9OUworVXNhZ2UgT2YgQ29udGVudAogCi0iQ29udHJpYnV0aW9uIiBtZWFuczoKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULgogCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCitBcHBsaWNhYmxlIExpY2Vuc2VzCiAKLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LgogCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS4KIAotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZQorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heQorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLgorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy4KIAotd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi1BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKLWFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAotZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcworYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOgogCi0iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5CistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucworLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXMKIAotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZwordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZQorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3UKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdQord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2gKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS4KIAotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOgogCi0iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCkKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCkKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCkKIAotMi4gR1JBTlQgT0YgUklHSFRTCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuCiAKLWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCi1hbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLgorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CiAKLWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQotY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCi1hZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKLWFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLgogCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KLWFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKLWJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZQorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0CithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZQorZm9sbG93aW5nOgogCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bwotZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heQorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LgorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLgorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2gKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZQorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4KIAotMy4gUkVRVUlSRU1FTlRTCitDcnlwdG9ncmFwaHkKIAotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseQorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcworcGVybWl0dGVkLgogCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKLXdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKLW90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAotaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAotdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwotdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgotb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCi1icm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5Ci0gcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKLXRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCi1yZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KLVVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCi10aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCi10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi1DT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAotTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCi1kZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQotd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKLURJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCi1IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi1PVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotNy4gR0VORVJBTAotCi1JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKLXByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAotUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCi1saXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAotbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KLW9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcwotIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKLWlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCi1uZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQotcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKLWRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCi1uZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcwotb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCi1vZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuc2RrL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IGI2OTcxODMuLjExNWI4YzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZGsvYnVpbGQucHJvcGVydGllcwpAQCAtMSArMSBAQAotYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLXYxMC5odG1sLCBmZWF0dXJlLnhtbAorYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLTIuMC5odG1sLCBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZGsvZXBsLTIuMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZGsvZXBsLTIuMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2ExODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9lcGwtMi4wLmh0bWwKQEAgLTAsMCArMSwzMDAgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDIuMDwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBtYXJnaW46IDEuNWVtIDNlbTsKKyAgICAgIH0KKyAgICAgIGgxeworICAgICAgICBmb250LXNpemU6MS41ZW07CisgICAgICB9CisgICAgICBoMnsKKyAgICAgICAgZm9udC1zaXplOjFlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTowLjVlbTsKKyAgICAgICAgbWFyZ2luLXRvcDoxZW07CisgICAgICB9CisgICAgICBwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICAgIH0KKyAgICAgIHVsLCBvbHsKKyAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wPC9oMT4KKyAgICA8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgICAgUFVCTElDIExJQ0VOU0UgKCZsZHF1bztBR1JFRU1FTlQmcmRxdW87KS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgICAgT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJiMwMzk7UyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRlZmluaXRpb25zIj4xLiBERUZJTklUSU9OUzwvaDI+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dGlvbiZyZHF1bzsgbWVhbnM6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICAgICAgICBhbmQgYXJlIERpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24KKyAgICAgICAgJmxkcXVvO29yaWdpbmF0ZXMmcmRxdW87IGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAorICAgICAgICBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJiMwMzk7cyBiZWhhbGYuCisgICAgICAgIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gdGhhdAorICAgICAgICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPiZsZHF1bztDb250cmlidXRvciZyZHF1bzsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3A+CisgICAgPHA+JmxkcXVvO0xpY2Vuc2VkIFBhdGVudHMmcmRxdW87IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKKyAgICAgIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKKyAgICAgIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1Byb2dyYW0mcmRxdW87IG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCisgICAgICBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztSZWNpcGllbnQmcmRxdW87IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIG9yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEZXJpdmF0aXZlIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO01vZGlmaWVkIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorICAgICAgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgICBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKKyAgICAgIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCisgICAgICBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsIGludGVyZmFjZXMsCisgICAgICB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5IGluIGVhY2ggY2FzZQorICAgICAgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbSBvciBNb2RpZmllZAorICAgICAgV29ya3MgdGhlcmVvZi4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rpc3RyaWJ1dGUmcmRxdW87IG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCisgICAgICBpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U291cmNlIENvZGUmcmRxdW87IG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworICAgICAgbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKKyAgICAgIGRvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NlY29uZGFyeSBMaWNlbnNlJnJkcXVvOyBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgICAgVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKKyAgICAgIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCisgICAgICBDb250cmlidXRvci4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJncmFudC1vZi1yaWdodHMiPjIuIEdSQU5UIE9GIFJJR0hUUzwvaDI+CisgICAgPHVsPgorICAgICAgPGxpPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgICAgICAgIHB1YmxpY2x5IHBlcmZvcm0sIERpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MuCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgICAgICAgIGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsCisgICAgICAgIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwKKyAgICAgICAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgICAgICAgIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwKKyAgICAgICAgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKKyAgICAgICAgYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCisgICAgICAgIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQorICAgICAgICBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIKKyAgICAgICAgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgICAgICAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgICAgICAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgICAgICAgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgICAgICAgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgICAgICAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgICAgICAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzCisgICAgICAgIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQorICAgICAgICByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLAorICAgICAgICBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvCisgICAgICAgIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQmIzAzOTtzCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisgICAgICA8L2xpPgorICAgICAgPGxpPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKKyAgICAgICAgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisgICAgICA8L2xpPgorICAgICAgPGxpPmUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubyBDb250cmlidXRvcgorICAgICAgICBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyB0byBhbnkgUmVjaXBpZW50IChvdGhlciB0aGFuIHRob3NlIHNldCBmb3J0aAorICAgICAgICBpbiB0aGlzIEFncmVlbWVudCkgYXMgYSByZXN1bHQgb2Ygc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJlY2VpcHQgb2YgdGhlCisgICAgICAgIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UgKGlmIHBlcm1pdHRlZCB1bmRlcgorICAgICAgICB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+My4gUkVRVUlSRU1FTlRTPC9oMj4KKyAgICA8cD4zLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgICAgICAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgICAgICAgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgICAgICAgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgICAgICAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICAgICAgICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgICAgICAgIGRpZmZlcmVudCB0aGFuIHRoaXMgQWdyZWVtZW50LCBwcm92aWRlZCB0aGF0IHN1Y2ggbGljZW5zZToKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwKKyAgICAgICAgICAgIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyYjMDM5OyByaWdodHMgaW4gdGhlCisgICAgICAgICAgICBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkgcGFydHkKKyAgICAgICAgICAgIHRvIGJlIHVuZGVyIGEgbGljZW5zZSB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgc2VjdGlvbiAzLgorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBvciBpZiB0aGUgUHJvZ3JhbSAoaSkKKyAgICAgICAgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IgZmlsZXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdW5kZXIgYSBTZWNvbmRhcnkgTGljZW5zZSwgYW5kIChpaSkgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgYXR0YWNoZWQgdG8KKyAgICAgICAgdGhlIFNvdXJjZSBDb2RlIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgICAgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2gKKyAgICAgICAgU2Vjb25kYXJ5IExpY2Vuc2VzLCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssCisgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwgb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5CisgICAgICAoJmxzcXVvO25vdGljZXMmcnNxdW87KSBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtIGZyb20gYW55IGNvcHkgb2YgdGhlIFByb2dyYW0gd2hpY2gKKyAgICAgIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZCB0aGVpciBvd24gYXBwcm9wcmlhdGUKKyAgICAgIG5vdGljZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iY29tbWVyY2lhbC1kaXN0cmlidXRpb24iPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9oMj4KKyAgICA8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcworICAgICAgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCisgICAgICBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUKKyAgICAgIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQKKyAgICAgIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlcgorICAgICAgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQorICAgICAgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmbGRxdW87Q29tbWVyY2lhbCBDb250cmlidXRvciZyZHF1bzspCisgICAgICBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisgICAgICAoJmxkcXVvO0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnJkcXVvOykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworICAgICAgKGNvbGxlY3RpdmVseSAmbGRxdW87TG9zc2VzJnJkcXVvOykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKKyAgICAgIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50CisgICAgICBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uCisgICAgICB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuCisgICAgICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZworICAgICAgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvCisgICAgICBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCisgICAgICBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sCisgICAgICB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZAorICAgICAgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKyAgICA8L3A+CisgICAgPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbQorICAgICAgaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCisgICAgICBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMKKyAgICAgIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3ImIzAzOTtzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorICAgICAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMKKyAgICAgIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKKyAgICAgIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMKKyAgICAgIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9IndhcnJhbnR5Ij41LiBOTyBXQVJSQU5UWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZsZHF1bztBUyBJUyZyZHF1bzsgQkFTSVMsIFdJVEhPVVQKKyAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCisgICAgICBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUKKyAgICAgIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlCisgICAgICB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCisgICAgICBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkaXNjbGFpbWVyIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZCisgICAgICBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisgICAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKKyAgICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgICAgICBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKKyAgICAgIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJnZW5lcmFsIj43LiBHRU5FUkFMPC9oMj4KKyAgICA8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorICAgICAgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZQorICAgICAgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlCisgICAgICBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50CisgICAgICBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisgICAgPC9wPgorICAgIDxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmCisgICAgICAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQorICAgICAgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyBncmFudGVkCisgICAgICB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAgICA8L3A+CisgICAgPHA+QWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bworICAgICAgY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZAorICAgICAgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nCisgICAgICBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtCisgICAgICBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCYjMDM5O3Mgb2JsaWdhdGlvbnMgdW5kZXIKKyAgICAgIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlCisgICAgICBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorICAgIDwvcD4KKyAgICA8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkKKyAgICAgIG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcworICAgICAgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudAorICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0CisgICAgICB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50CisgICAgICBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzCisgICAgICB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YKKyAgICAgIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorICAgICAgKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIERpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24KKyAgICAgIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKKyAgICAgIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBEaXN0cmlidXRlCisgICAgICB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uCisgICAgPC9wPgorICAgIDxwPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorICAgICAgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55CisgICAgICBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAorICAgICAgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAorICAgICAgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IGlzIGludGVuZGVkCisgICAgICB0byBiZSBlbmZvcmNlYWJsZSBieSBhbnkgZW50aXR5IHRoYXQgaXMgbm90IGEgQ29udHJpYnV0b3Igb3IgUmVjaXBpZW50LgorICAgICAgTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImV4aGliaXQtYSI+RXhoaWJpdCBBICZuZGFzaDsgRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlPC9oMj4KKyAgICA8cD4mbGRxdW87VGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIAorICAgIAlTZWNvbmRhcnkgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIAorICAgIAlpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IHtuYW1lIGxpY2Vuc2UocyksCisgICAgCXZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uJnJkcXVvOworICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPlNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgICAgICAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorICAgICAgPC9wPgorICAgICAgPHA+SWYgaXQgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSB0byBwdXQgdGhlIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgZmlsZSwKKyAgICAgICAgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRSBmaWxlIGluIGEKKyAgICAgICAgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3IKKyAgICAgICAgc3VjaCBhIG5vdGljZS4KKyAgICAgIDwvcD4KKyAgICAgIDxwPllvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOThhY2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZGsvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICBib2R5IHsKLSAgICBzaXplOiA4LjVpbiAxMS4waW47Ci0gICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOwotICAgIHRhYi1pbnRlcnZhbDogMC41aW47Ci0gICAgfQotICBwIHsgIAkKLSAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICBtYXJnaW4tdG9wOiAgMC41ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0gICAgfQotICBwLmxpc3QgewotICAJbWFyZ2luLWxlZnQ6IDAuNWluOwotICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOwotICAgIH0KLSAgPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQotUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCi1BR1JFRU1FTlQuPC9wPgotCi08cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKLXRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cwotQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcwotb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAotb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKLWxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCi1zdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAotYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCi1ncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKLWFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAotaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Ci10aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKLWZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcwotb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgotY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcwotQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKLXBhcnR5OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQotZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCi1yZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCi1leGNoYW5nZS48L3A+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKLWNvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKLWxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgotdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKLXBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCi1pbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpCi1hcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKLXBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQotYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KLW9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCi1JbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgotZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKLWNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKLWFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KLWRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKLXBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCi1Db250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi1tdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KLQotPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKLUFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQotT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLXRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCi1kYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgotaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAotTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKLVdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+Ci0KLTxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQotKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCi1Qcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCi1zb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCi1kYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0Ci1mYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKLWFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwotdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+Ci0KLTxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZwotcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKLUZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCi1zdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCi1naXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcwotZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KLXJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcwotQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQotdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCi10aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cwotcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgotCi0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNkay9saWNlbnNlLmh0bWwKaW5kZXggNmU1NzlhNS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZGsvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuc2RrL2xpY2Vuc2UuaHRtbApAQCAtMSwxNjQgKzEsMTg5IEBACi08IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5GZWJydWFyeSAxLCAyMDExPC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKLSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCi0gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCi1zb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAotYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKLWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKLW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKLUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKLXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAotbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCi1vZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCi1GZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCi1saXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQotIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAotaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0Ci0gYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKLWZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCi1mb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KLSAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCi1DT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAotb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCi1leGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCi1hbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAotY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCi1wYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKLSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bwotIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKLVRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKLXRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCi1hY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiAKLXdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCAKLWV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi1tYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciAKLXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgCi1Tb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgCi1Tb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQKLSBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgCi11c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gCi1VcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAotd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlCi0gY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCAKLWFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIAotc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgCi10aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9MSUNFTlNFLnR4dAppbmRleCBmZjQyYWQ0Li5mYzU5MzhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL0xJQ0VOU0UudHh0CisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvTElDRU5TRS50eHQKQEAgLTEsMTYxICsxLDE0MCBAQAotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKK0VjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudAogCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04KLU9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorTm92ZW1iZXIgMjIsIDIwMTcKIAotMS4gREVGSU5JVElPTlMKK1VzYWdlIE9mIENvbnRlbnQKIAotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04KK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRQorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRQorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC4KIAotYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorQXBwbGljYWJsZSBMaWNlbnNlcwogCi1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbgoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZQorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC4KIAotaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbgorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5CisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcworZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuCiAKLWlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLgorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUgorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi4KKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5CisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vcgorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLgorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYQorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuCiAKLXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCi1hY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKLW1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKLWRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbgorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcKK2xvY2F0aW9uczoKIAotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeQorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFScworLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzCiAKLSJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgotaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZQorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91Cit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3UKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuCiAKLSJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKToKIAotIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKQorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSkKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCkKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpCiAKLTIuIEdSQU5UIE9GIFJJR0hUUworSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTworVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LgogCi1hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQotYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS4KK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neQogCi1iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKLWNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAotYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90Ci1hcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2gKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlcgorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5CisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZworc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbgorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS4KIAotYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCi1hc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5Ci1iYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91cgorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUKK2ZvbGxvd2luZzoKIAotZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KLWdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC4KKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0bworICAgIHRoZSBUYXJnZXQgTWFjaGluZS4KKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuCiAKLTMuIFJFUVVJUkVNRU5UUworQ3J5cHRvZ3JhcGh5CiAKLUEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMKK3Blcm1pdHRlZC4KIAotYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6Ci0KLWkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCi13YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCi1maXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKLQotaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKLQotaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55Ci1vdGhlciBwYXJ0eTsgYW5kCi0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQKLWluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgotCi1hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0KLUNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4KLQotRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgotCi00LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgotCi1Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKLXRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMKLXRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKLW90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCi0oIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQotYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucwotYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbAotcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQotIHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KLQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzCi10aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcwotcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCi1VbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0bwotdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LAotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotNS4gTk8gV0FSUkFOVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKLU5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvcgotZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2UKLXdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KLQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAotSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLTcuIEdFTkVSQUwKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCi1wcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2gKLVJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAotbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2gKLW5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uCi1vZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKLSBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50Ci1pcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaAotbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKLXJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCi1kaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZQotbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KLQotVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMKLW9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZQotb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL2Fib3V0Lmh0bWwKaW5kZXggNjRjMDU5OC4uZThiODM0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9hYm91dC5odG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvYWJvdXQuaHRtbApAQCAtOCwxMyArOCwxMyBAQAogPGJvZHkgbGFuZz0iRU4tVVMiPgogPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CiAgCi08cD5KdW5lIDEsIDIwMTY8L3A+CQorPHA+Tm92ZW1iZXIgMzAsIDIwMTc8L3A+CQogPGgzPkxpY2Vuc2U8L2gzPgogCiA8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KIAogPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvYWJvdXQucHJvcGVydGllcwppbmRleCBhZWJkN2QwLi5iZWE0MDE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL2Fib3V0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCkBAIC0xLDkgKzEsMTEgQEAKICMKICMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKICMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAjCiAjIENvbnRyaWJ1dG9yczoKICMgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTE3LDkgKzE5LDExIEBACiBmZWF0dXJlVGV4dD1cCiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIFxuXAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuXAorXG5cCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuXAogXG5cCiBDb250cmlidXRvcnM6XG5cCiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvYnVpbGQucHJvcGVydGllcwppbmRleCA0M2Y0NmMzLi44MDM0YTAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogICAgICAgIC4sXAogICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sCiBzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIAorICAgICAgICAgICAgICAgZXBsLTIuMC5odG1sCQkJICAgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL2VwbC0yLjAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvZXBsLTIuMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2ExODEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL2VwbC0yLjAuaHRtbApAQCAtMCwwICsxLDMwMCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICA8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMi4wPC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgYm9keSB7CisgICAgICAgIG1hcmdpbjogMS41ZW0gM2VtOworICAgICAgfQorICAgICAgaDF7CisgICAgICAgIGZvbnQtc2l6ZToxLjVlbTsKKyAgICAgIH0KKyAgICAgIGgyeworICAgICAgICBmb250LXNpemU6MWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOjAuNWVtOworICAgICAgICBtYXJnaW4tdG9wOjFlbTsKKyAgICAgIH0KKyAgICAgIHAgeworICAgICAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgICAgfQorICAgICAgdWwsIG9seworICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAyLjA8L2gxPgorICAgIDxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCisgICAgICBQVUJMSUMgTElDRU5TRSAoJmxkcXVvO0FHUkVFTUVOVCZyZHF1bzspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OCisgICAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQmIzAzOTtTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGVmaW5pdGlvbnMiPjEuIERFRklOSVRJT05TPC9oMj4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0aW9uJnJkcXVvOyBtZWFuczo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb250ZW50CisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2xpPgorICAgICAgICAgIDxsaT5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICAgIHdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tCisgICAgICAgIGFuZCBhcmUgRGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgorICAgICAgICAmbGRxdW87b3JpZ2luYXRlcyZyZHF1bzsgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3ImIzAzOTtzIGJlaGFsZi4KKyAgICAgICAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgICAgICAgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dG9yJnJkcXVvOyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvcD4KKyAgICA8cD4mbGRxdW87TGljZW5zZWQgUGF0ZW50cyZyZHF1bzsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaAorICAgICAgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZQorICAgICAgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UHJvZ3JhbSZyZHF1bzsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgRGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMKKyAgICAgIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1JlY2lwaWVudCZyZHF1bzsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgb3IgYW55IFNlY29uZGFyeSBMaWNlbnNlIChhcyBhcHBsaWNhYmxlKSwgaW5jbHVkaW5nIENvbnRyaWJ1dG9ycy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rlcml2YXRpdmUgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIENvZGUgb3Igb3RoZXIKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFByb2dyYW0gYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87TW9kaWZpZWQgV29ya3MmcmRxdW87IHNoYWxsIG1lYW4gYW55IHdvcmsgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybSB0aGF0CisgICAgICByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20sIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUKKyAgICAgIGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLCBpbmNsdWRpbmcsIGZvciBwdXJwb3NlcyBvZiBjbGFyaXR5IGFueSBuZXcgZmlsZQorICAgICAgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGNvbnRhaW5zIGFueSBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbS4gTW9kaWZpZWQKKyAgICAgIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgY29udGFpbiBvbmx5IGRlY2xhcmF0aW9ucywgaW50ZXJmYWNlcywKKyAgICAgIHR5cGVzLCBjbGFzc2VzLCBzdHJ1Y3R1cmVzLCBvciBmaWxlcyBvZiB0aGUgUHJvZ3JhbSBzb2xlbHkgaW4gZWFjaCBjYXNlCisgICAgICBpbiBvcmRlciB0byBsaW5rIHRvLCBiaW5kIGJ5IG5hbWUsIG9yIHN1YmNsYXNzIHRoZSBQcm9ncmFtIG9yIE1vZGlmaWVkCisgICAgICBXb3JrcyB0aGVyZW9mLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGlzdHJpYnV0ZSZyZHF1bzsgbWVhbnMgdGhlIGFjdHMgb2YgYSkgZGlzdHJpYnV0aW5nIG9yIGIpIG1ha2luZyBhdmFpbGFibGUKKyAgICAgIGluIGFueSBtYW5uZXIgdGhhdCBlbmFibGVzIHRoZSB0cmFuc2ZlciBvZiBhIGNvcHkuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTb3VyY2UgQ29kZSZyZHF1bzsgbWVhbnMgdGhlIGZvcm0gb2YgYSBQcm9ncmFtIHByZWZlcnJlZCBmb3IgbWFraW5nCisgICAgICBtb2RpZmljYXRpb25zLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLAorICAgICAgZG9jdW1lbnRhdGlvbiBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U2Vjb25kYXJ5IExpY2Vuc2UmcmRxdW87IG1lYW5zIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgICBWZXJzaW9uIDIuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRoYXQgbGljZW5zZSwgaW5jbHVkaW5nIGFueQorICAgICAgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFzIGlkZW50aWZpZWQgYnkgdGhlIGluaXRpYWwKKyAgICAgIENvbnRyaWJ1dG9yLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdyYW50LW9mLXJpZ2h0cyI+Mi4gR1JBTlQgT0YgUklHSFRTPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgICAgICAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQKKyAgICAgICAgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwKKyAgICAgICAgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAorICAgICAgICBpZiBhbnksIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwKKyAgICAgICAgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLAorICAgICAgICBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorICAgICAgICBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKKyAgICAgICAgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55CisgICAgICAgIG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlcgorICAgICAgICBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisgICAgICA8L2xpPgorICAgICAgPGxpPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZQorICAgICAgICBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZQorICAgICAgICBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKKyAgICAgICAgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4KKyAgICAgICAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcworICAgICAgICBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorICAgICAgICBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMKKyAgICAgICAgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsCisgICAgICAgIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8KKyAgICAgICAgYWxsb3cgUmVjaXBpZW50IHRvIERpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCYjMDM5O3MKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudAorICAgICAgICBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+ZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vIENvbnRyaWJ1dG9yCisgICAgICAgIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4gdGhvc2Ugc2V0IGZvcnRoCisgICAgICAgIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmVjZWlwdCBvZiB0aGUKKyAgICAgICAgUHJvZ3JhbSB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZSAoaWYgcGVybWl0dGVkIHVuZGVyCisgICAgICAgIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDMpLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj4zLiBSRVFVSVJFTUVOVFM8L2gyPgorICAgIDxwPjMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgdGhlIFByb2dyYW0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGFzIFNvdXJjZSBDb2RlLCBpbgorICAgICAgICBhY2NvcmRhbmNlIHdpdGggc2VjdGlvbiAzLjIsIGFuZCB0aGUgQ29udHJpYnV0b3IgbXVzdCBhY2NvbXBhbnkKKyAgICAgICAgdGhlIFByb2dyYW0gd2l0aCBhIHN0YXRlbWVudCB0aGF0IHRoZSBTb3VyY2UgQ29kZSBmb3IgdGhlIFByb2dyYW0KKyAgICAgICAgaXMgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgaW5mb3JtcyBSZWNpcGllbnRzIGhvdyB0bworICAgICAgICBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5CisgICAgICAgIHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlOyBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIGIpIHRoZSBDb250cmlidXRvciBtYXkgRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSB1bmRlciBhIGxpY2Vuc2UKKyAgICAgICAgZGlmZmVyZW50IHRoYW4gdGhpcyBBZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQgc3VjaCBsaWNlbnNlOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzCisgICAgICAgICAgICBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbAorICAgICAgICAgICAgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aWlpKSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzJiMwMzk7IHJpZ2h0cyBpbiB0aGUKKyAgICAgICAgICAgIFNvdXJjZSBDb2RlIHVuZGVyIHNlY3Rpb24gMy4yOyBhbmQKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5pdikgcmVxdWlyZXMgYW55IHN1YnNlcXVlbnQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFueSBwYXJ0eQorICAgICAgICAgICAgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBzZWN0aW9uIDMuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjIgV2hlbiB0aGUgUHJvZ3JhbSBpcyBEaXN0cmlidXRlZCBhcyBTb3VyY2UgQ29kZTo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZSBQcm9ncmFtIChpKQorICAgICAgICBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvciBmaWxlcyBtYWRlIGF2YWlsYWJsZQorICAgICAgICB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbCBDb250cmlidXRvciBhdHRhY2hlZCB0bworICAgICAgICB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgICB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaAorICAgICAgICBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4zIENvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywKKyAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LCBvciBsaW1pdGF0aW9ucyBvZiBsaWFiaWxpdHkKKyAgICAgICgmbHNxdW87bm90aWNlcyZyc3F1bzspIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0gZnJvbSBhbnkgY29weSBvZiB0aGUgUHJvZ3JhbSB3aGljaAorICAgICAgdGhleSBEaXN0cmlidXRlLCBwcm92aWRlZCB0aGF0IENvbnRyaWJ1dG9ycyBtYXkgYWRkIHRoZWlyIG93biBhcHByb3ByaWF0ZQorICAgICAgbm90aWNlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJjb21tZXJjaWFsLWRpc3RyaWJ1dGlvbiI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2gyPgorICAgIDxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCisgICAgICB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMKKyAgICAgIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZQorICAgICAgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZAorICAgICAgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyCisgICAgICBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhCisgICAgICBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZsZHF1bztDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnJkcXVvOykKKyAgICAgIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IKKyAgICAgICgmbGRxdW87SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcmRxdW87KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzCisgICAgICAoY29sbGVjdGl2ZWx5ICZsZHF1bztMb3NzZXMmcmRxdW87KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworICAgICAgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQKKyAgICAgIGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24KKyAgICAgIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4KKyAgICAgIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nCisgICAgICB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8KKyAgICAgIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKKyAgICAgIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwKKyAgICAgIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkCisgICAgICBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorICAgIDwvcD4KKyAgICA8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtCisgICAgICBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKKyAgICAgIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcworICAgICAgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciYjMDM5O3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCisgICAgICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcworICAgICAgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAorICAgICAgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcworICAgICAgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0id2FycmFudHkiPjUuIE5PIFdBUlJBTlRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJmxkcXVvO0FTIElTJnJkcXVvOyBCQVNJUywgV0lUSE9VVAorICAgICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKKyAgICAgIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZQorICAgICAgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UKKyAgICAgIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKKyAgICAgIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRpc2NsYWltZXIiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9oMj4KKyAgICA8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVECisgICAgICBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkKKyAgICAgIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAgICAgIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorICAgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAgICAgIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUworICAgICAgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImdlbmVyYWwiPjcuIEdFTkVSQUw8L2gyPgorICAgIDxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCisgICAgICBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlCisgICAgICByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUKKyAgICAgIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQKKyAgICAgIG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKyAgICA8L3A+CisgICAgPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYKKyAgICAgIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCisgICAgICBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQmIzAzOTtzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIGdyYW50ZWQKKyAgICAgIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICAgIDwvcD4KKyAgICA8cD5BbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvCisgICAgICBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kCisgICAgICBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcKKyAgICAgIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KKyAgICAgIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50JiMwMzk7cyBvYmxpZ2F0aW9ucyB1bmRlcgorICAgICAgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUKKyAgICAgIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisgICAgPC9wPgorICAgIDxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heQorICAgICAgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzCisgICAgICB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50CisgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQKKyAgICAgIHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQKKyAgICAgIFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMKKyAgICAgIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZgorICAgICAgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCisgICAgICAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgRGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbgorICAgICAgb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldworICAgICAgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIERpc3RyaWJ1dGUKKyAgICAgIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4KKyAgICA8L3A+CisgICAgPHA+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50CisgICAgICByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkKKyAgICAgIENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCisgICAgICBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkCisgICAgICB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuIE5vdGhpbmcgaW4gdGhpcyBBZ3JlZW1lbnQgaXMgaW50ZW5kZWQKKyAgICAgIHRvIGJlIGVuZm9yY2VhYmxlIGJ5IGFueSBlbnRpdHkgdGhhdCBpcyBub3QgYSBDb250cmlidXRvciBvciBSZWNpcGllbnQuCisgICAgICBObyB0aGlyZC1wYXJ0eSBiZW5lZmljaWFyeSByaWdodHMgYXJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZXhoaWJpdC1hIj5FeGhpYml0IEEgJm5kYXNoOyBGb3JtIG9mIFNlY29uZGFyeSBMaWNlbnNlcyBOb3RpY2U8L2gyPgorICAgIDxwPiZsZHF1bztUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgCisgICAgCVNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggCisgICAgCWluIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKKyAgICAJdmVyc2lvbihzKSwgYW5kIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBoZXJlfS4mcmRxdW87CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHA+U2ltcGx5IGluY2x1ZGluZyBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyB0aGlzIEV4aGliaXQgQQorICAgICAgICBpcyBub3Qgc3VmZmljaWVudCB0byBsaWNlbnNlIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBTZWNvbmRhcnkgTGljZW5zZXMuCisgICAgICA8L3A+CisgICAgICA8cD5JZiBpdCBpcyBub3QgcG9zc2libGUgb3IgZGVzaXJhYmxlIHRvIHB1dCB0aGUgbm90aWNlIGluIGEgcGFydGljdWxhciBmaWxlLAorICAgICAgICB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFIGZpbGUgaW4gYQorICAgICAgICByZWxldmFudCBkaXJlY3RvcnkpIHdoZXJlIGEgcmVjaXBpZW50IHdvdWxkIGJlIGxpa2VseSB0byBsb29rIGZvcgorICAgICAgICBzdWNoIGEgbm90aWNlLgorICAgICAgPC9wPgorICAgICAgPHA+WW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuPC9wPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOThhY2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIGJvZHkgewotICAgIHNpemU6IDguNWluIDExLjBpbjsKLSAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47Ci0gICAgdGFiLWludGVydmFsOiAwLjVpbjsKLSAgICB9Ci0gIHAgeyAgCQotICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwotICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKLSAgICB9Ci0gIHAubGlzdCB7Ci0gIAltYXJnaW4tbGVmdDogMC41aW47Ci0gICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKLSAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07Ci0gICAgfQotICA8L3N0eWxlPgotCi08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLQotPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+Ci0KLTxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCi1QVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKLUFHUkVFTUVOVC48L3A+Ci0KLTxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KLQotPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCi1jb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Ci08cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KLW9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCi1Db250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCi1Qcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAotQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKLWFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwotdGhlIFByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKLXdpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCi10aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgotCi08cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCi1vZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCi1vZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAotbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCi1Qcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKLXN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCi1ieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKLWNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKLWdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcwotYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQotcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAotQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQotYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCi1ncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bwotc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKLWV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Ci10byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0Ci1oYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKLXRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQotZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCi1vciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCi1jb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCi1BZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgotcGFydHk7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCi1mcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKLXJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKLWV4Y2hhbmdlLjwvcD4KLQotPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAotY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi13aXRoaW4gdGhlIFByb2dyYW0uPC9wPgotCi08cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cwotQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAotUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KLQotPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQotbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCi10aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQotcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKLWluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCi0oIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKLWluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKLWFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAotcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCi1hY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cwotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKLW9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgotb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Ci10aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKLUluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCi1leHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQotY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQotYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bwotZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQotcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKLUNvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLW11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgotCi08cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCi1PUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKLWRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCi1pbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCi1OT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORwotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgotdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKLVByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKLXNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKLWRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKLWZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQotYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCi11bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCi1yZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKLUFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQotRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKLXN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCi1leHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubwotcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCi10aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Ci10byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKLXRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCi1yaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+Ci0KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9saWNlbnNlLmh0bWwKaW5kZXggNmU1NzlhNS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9saWNlbnNlLmh0bWwKQEAgLTEsMTY0ICsxLDE4OSBAQAotPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCi0gRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbwotIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIAotc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSAKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCi1mYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCi1tb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCi1GcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCi1zdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKLW5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAotb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAotRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAotbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKLSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyAKLWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdAotIGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgCi1mb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIAotZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCi0gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCAKLW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAotZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAotYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKLWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAotcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCi0gSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8KLSBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyAKLVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggCi10aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIAotYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCi13aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCi1leHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAotbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAotU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAotU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0Ci0gZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAotdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAotVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLXdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQotIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCi1hbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKLXNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9wb20ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9wb20ueG1sCmluZGV4IGUyMjIyZTUuLmVmMGYzZmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL3BvbS54bWwKQEAgLTIsOSArMiwxMSBAQAogPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIDwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIC0tPgogPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KLTwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAtLT4KIDwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgotPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAtLT4KKzwhLS0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgLS0+CiA8IS0tIyAtLT4KIDwhLS0jIENvbnRyaWJ1dG9yczogLS0+CiA8IS0tIyAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS90ZXN0cy9TdHJhdGVneURTTEluamVjdG9yUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMSW5qZWN0b3JQcm92aWRlci5qYXZhCmluZGV4IDMwYjJkYjkuLjViODIzMzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMSW5qZWN0b3JQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMSW5qZWN0b3JQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsMTcgQEAKLS8qCi0gKiBnZW5lcmF0ZWQgYnkgWHRleHQgMi4xMS4wCisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHM7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdGVzdHMvU3RyYXRlZ3lEU0xQYXJzaW5nVGVzdC54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdGVzdHMvU3RyYXRlZ3lEU0xQYXJzaW5nVGVzdC54dGVuZAppbmRleCBhM2YwZjIwLi40ZDBjNDY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMUGFyc2luZ1Rlc3QueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS90ZXN0cy9TdHJhdGVneURTTFBhcnNpbmdUZXN0Lnh0ZW5kCkBAIC0xLDUgKzEsMTcgQEAKLS8qCi0gKiBnZW5lcmF0ZWQgYnkgWHRleHQgMi4xMS4wCisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS50ZXN0cy94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS90ZXN0cy9TdHJhdGVneURTTFBhcnNpbmdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMUGFyc2luZ1Rlc3QuamF2YQppbmRleCA2MTliMGY5Li5lMjJjNDM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMUGFyc2luZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Rlc3RzL1N0cmF0ZWd5RFNMUGFyc2luZ1Rlc3QuamF2YQpAQCAtMSwxMSArMSwyMSBAQAogLyoqCi0gKiBnZW5lcmF0ZWQgYnkgWHRleHQgMi4xMS4wCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnRlc3RzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5TdHJhdGVneU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudGVzdHMuU3RyYXRlZ3lEU0xJbmplY3RvclByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbjsKQEAgLTMyLDEwICs0Miw3IEBACiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBmaW5hbCBTdHJhdGVneU1vZGVsIHJlc3VsdCA9IHRoaXMucGFyc2VIZWxwZXIucGFyc2UoX2J1aWxkZXIpOwogICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgIFJlc291cmNlIF9lUmVzb3VyY2UgPSByZXN1bHQuZVJlc291cmNlKCk7Ci0gICAgICBFTGlzdDxSZXNvdXJjZS5EaWFnbm9zdGljPiBfZXJyb3JzID0gX2VSZXNvdXJjZS5nZXRFcnJvcnMoKTsKLSAgICAgIGJvb2xlYW4gX2lzRW1wdHkgPSBfZXJyb3JzLmlzRW1wdHkoKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKF9pc0VtcHR5KTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5lUmVzb3VyY2UoKS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpOwogICAgIH0gY2F0Y2ggKFRocm93YWJsZSBfZSkgewogICAgICAgdGhyb3cgRXhjZXB0aW9ucy5zbmVha3lUaHJvdyhfZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvTElDRU5TRS50eHQKaW5kZXggZmY0MmFkNC4uZmM1OTM4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9MSUNFTlNFLnR4dAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL0xJQ0VOU0UudHh0CkBAIC0xLDE2MSArMSwxNDAgQEAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCitFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQKIAotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCi1PUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KK05vdmVtYmVyIDIyLCAyMDE3CiAKLTEuIERFRklOSVRJT05TCitVc2FnZSBPZiBDb250ZW50CiAKLSJDb250cmlidXRpb24iIG1lYW5zOgorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRgorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVECitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVQorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuCiAKLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKK0FwcGxpY2FibGUgTGljZW5zZXMKIAotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCiAKLWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24KK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeQorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLgogCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5CisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4KKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYQorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heQorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS4KKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLgogCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLUEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCi1tb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90Ci1kZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4KK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIgorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCitsb2NhdGlvbnM6CiAKLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcworLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnMKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zCistICAgRmVhdHVyZSBkaXJlY3RvcmllcwogCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKLWl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdQord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91Cit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIgorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LgogCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6CiAKLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKQorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbCkKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKQogCi0yLiBHUkFOVCBPRiBSSUdIVFMKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8KK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcworcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC4KIAotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKLWFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKIAotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCi1jb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKLWFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAotYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseQorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24KK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuCiAKLWMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubwotYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQotYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlCitmb2xsb3dpbmc6CiAKLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCi1ncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5CisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZQorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8KKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZQorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZQorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLgogCi0zLiBSRVFVSVJFTUVOVFMKK0NyeXB0b2dyYXBoeQogCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCiAKLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZwotd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQotb3RoZXIgcGFydHk7IGFuZAotCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0Ci1pbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCi10aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCi1vdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKLWJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKLSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCi0KLUZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwotdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKLXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgotVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCi0KLTUuIE5PIFdBUlJBTlRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCi1OT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKLWRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCi13aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCi0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAotcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCi0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCi1SZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKLWxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCi1ub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCi0gZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAotaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKLW5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCi1yaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQotZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKLW5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCi0KLVRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCi1vZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKLW9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZQorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9hYm91dC5odG1sCmluZGV4IDY0YzA1OTguLmU4YjgzNGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvYWJvdXQuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTMgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxwPk5vdmVtYmVyIDMwLCAyMDE3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2Fib3V0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2Fib3V0LnByb3BlcnRpZXMKaW5kZXggZjExMGM0MS4uNzBiM2M3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9hYm91dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvYWJvdXQucHJvcGVydGllcwpAQCAtMSw5ICsxLDExIEBACiAjCiAjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogIwogIyBDb250cmlidXRvcnM6CiAjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCkBAIC0xNyw5ICsxOSwxMSBAQAogZmVhdHVyZVRleHQ9XAogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIFxuXAogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCBcblwKIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAoraHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cblwKK1xuXAorU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcblwKIFxuXAogQ29udHJpYnV0b3JzOlxuXAogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvblxuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggMWQ0OTI0OC4uYjgyZjZkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvYnVpbGQucHJvcGVydGllcwpAQCAtOCwxMCArOCwxMCBAQAogICAgICAgICAgICAgICAgaTE4bi8sXAogICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBlcGwtMi4wLmh0bWwsXAogICAgICAgICAgICAgICAgaWNvbnMvCiBzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKICAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBlcGwtMi4wLmh0bWwsXAogICAgICAgICAgICAgICAgaWNvbnMvCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvZXBsLTIuMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9lcGwtMi4wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YTE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvZXBsLTIuMC5odG1sCkBAIC0wLDAgKzEsMzAwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgIDx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAyLjA8L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsKKyAgICAgICAgbWFyZ2luOiAxLjVlbSAzZW07CisgICAgICB9CisgICAgICBoMXsKKyAgICAgICAgZm9udC1zaXplOjEuNWVtOworICAgICAgfQorICAgICAgaDJ7CisgICAgICAgIGZvbnQtc2l6ZToxZW07CisgICAgICAgIG1hcmdpbi1ib3R0b206MC41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MWVtOworICAgICAgfQorICAgICAgcCB7CisgICAgICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgICB9CisgICAgICB1bCwgb2x7CisgICAgICAgIGxpc3Qtc3R5bGUtdHlwZTpub25lOworICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDIuMDwvaDE+CisgICAgPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICAgIFBVQkxJQyBMSUNFTlNFICgmbGRxdW87QUdSRUVNRU5UJnJkcXVvOykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICAgIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCYjMDM5O1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkZWZpbml0aW9ucyI+MS4gREVGSU5JVElPTlM8L2gyPgorICAgIDxwPiZsZHF1bztDb250cmlidXRpb24mcmRxdW87IG1lYW5zOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvbnRlbnQKKyAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgICAgICAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICAgICAgICZsZHF1bztvcmlnaW5hdGVzJnJkcXVvOyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2gKKyAgICAgICAgQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvciYjMDM5O3MgYmVoYWxmLgorICAgICAgICBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGNoYW5nZXMgb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHRoYXQKKyAgICAgICAgYXJlIG5vdCBNb2RpZmllZCBXb3Jrcy4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8cD4mbGRxdW87Q29udHJpYnV0b3ImcmRxdW87IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9wPgorICAgIDxwPiZsZHF1bztMaWNlbnNlZCBQYXRlbnRzJnJkcXVvOyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCisgICAgICBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCisgICAgICBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztQcm9ncmFtJnJkcXVvOyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBEaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworICAgICAgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87UmVjaXBpZW50JnJkcXVvOyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50CisgICAgICBvciBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UgKGFzIGFwcGxpY2FibGUpLCBpbmNsdWRpbmcgQ29udHJpYnV0b3JzLgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87RGVyaXZhdGl2ZSBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgUHJvZ3JhbSBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztNb2RpZmllZCBXb3JrcyZyZHF1bzsgc2hhbGwgbWVhbiBhbnkgd29yayBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtIHRoYXQKKyAgICAgIHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZQorICAgICAgY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCisgICAgICBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgY29udGFpbnMgYW55IGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLiBNb2RpZmllZAorICAgICAgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCBjb250YWluIG9ubHkgZGVjbGFyYXRpb25zLCBpbnRlcmZhY2VzLAorICAgICAgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseSBpbiBlYWNoIGNhc2UKKyAgICAgIGluIG9yZGVyIHRvIGxpbmsgdG8sIGJpbmQgYnkgbmFtZSwgb3Igc3ViY2xhc3MgdGhlIFByb2dyYW0gb3IgTW9kaWZpZWQKKyAgICAgIFdvcmtzIHRoZXJlb2YuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEaXN0cmlidXRlJnJkcXVvOyBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQorICAgICAgaW4gYW55IG1hbm5lciB0aGF0IGVuYWJsZXMgdGhlIHRyYW5zZmVyIG9mIGEgY29weS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NvdXJjZSBDb2RlJnJkcXVvOyBtZWFucyB0aGUgZm9ybSBvZiBhIFByb2dyYW0gcHJlZmVycmVkIGZvciBtYWtpbmcKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCisgICAgICBkb2N1bWVudGF0aW9uIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztTZWNvbmRhcnkgTGljZW5zZSZyZHF1bzsgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICAgIFZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CisgICAgICBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXMgaWRlbnRpZmllZCBieSB0aGUgaW5pdGlhbAorICAgICAgQ29udHJpYnV0b3IuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ3JhbnQtb2YtcmlnaHRzIj4yLiBHUkFOVCBPRiBSSUdIVFM8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorICAgICAgICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAorICAgICAgICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgICBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgICAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICAgICAgICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICAgICAgICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgICAgICAgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICAgICAgICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsCisgICAgICAgIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCisgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorICAgICAgICBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkKKyAgICAgICAgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyCisgICAgICAgIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCisgICAgICAgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgICAgICAgIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorICAgICAgICBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LgorICAgICAgICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgICAgICAgIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCisgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cworICAgICAgICBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKKyAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwKKyAgICAgICAgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0bworICAgICAgICBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50JiMwMzk7cworICAgICAgICByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50CisgICAgICAgIGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorICAgICAgPC9saT4KKyAgICAgIDxsaT5lKSBOb3R3aXRoc3RhbmRpbmcgdGhlIHRlcm1zIG9mIGFueSBTZWNvbmRhcnkgTGljZW5zZSwgbm8gQ29udHJpYnV0b3IKKyAgICAgICAgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbiB0aG9zZSBzZXQgZm9ydGgKKyAgICAgICAgaW4gdGhpcyBBZ3JlZW1lbnQpIGFzIGEgcmVzdWx0IG9mIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByZWNlaXB0IG9mIHRoZQorICAgICAgICBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlIChpZiBwZXJtaXR0ZWQgdW5kZXIKKyAgICAgICAgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMykuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPGgyIGlkPSJyZXF1aXJlbWVudHMiPjMuIFJFUVVJUkVNRU5UUzwvaDI+CisgICAgPHA+My4xIElmIGEgQ29udHJpYnV0b3IgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0gaW4gYW55IGZvcm0sIHRoZW46PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSB0aGUgUHJvZ3JhbSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMgU291cmNlIENvZGUsIGluCisgICAgICAgIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDMuMiwgYW5kIHRoZSBDb250cmlidXRvciBtdXN0IGFjY29tcGFueQorICAgICAgICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICAgICAgICBpcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZCBpbmZvcm1zIFJlY2lwaWVudHMgaG93IHRvCisgICAgICAgIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICAgICAgICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMKKyAgICAgICAgICAgIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsCisgICAgICAgICAgICBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5paWkpIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMmIzAzOTsgcmlnaHRzIGluIHRoZQorICAgICAgICAgICAgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPml2KSByZXF1aXJlcyBhbnkgc3Vic2VxdWVudCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYW55IHBhcnR5CisgICAgICAgICAgICB0byBiZSB1bmRlciBhIGxpY2Vuc2UgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIHNlY3Rpb24gMy4KKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgb3IgaWYgdGhlIFByb2dyYW0gKGkpCisgICAgICAgIGlzIGNvbWJpbmVkIHdpdGggb3RoZXIgbWF0ZXJpYWwgaW4gYSBzZXBhcmF0ZSBmaWxlIG9yIGZpbGVzIG1hZGUgYXZhaWxhYmxlCisgICAgICAgIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yIGF0dGFjaGVkIHRvCisgICAgICAgIHRoZSBTb3VyY2UgQ29kZSB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiBFeGhpYml0IEEgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICAgIHRoZW4gdGhlIFByb2dyYW0gbWF5IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoCisgICAgICAgIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvbGk+CisgICAgPC91bD4KKyAgICA8cD4zLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLAorICAgICAgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eQorICAgICAgKCZsc3F1bztub3RpY2VzJnJzcXVvOykgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mIHRoZSBQcm9ncmFtIHdoaWNoCisgICAgICB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQgdGhlaXIgb3duIGFwcHJvcHJpYXRlCisgICAgICBub3RpY2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImNvbW1lcmNpYWwtZGlzdHJpYnV0aW9uIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvaDI+CisgICAgPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKKyAgICAgIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcworICAgICAgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlCisgICAgICBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkCisgICAgICBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIKKyAgICAgIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEKKyAgICAgIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJmxkcXVvO0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcmRxdW87KQorICAgICAgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgorICAgICAgKCZsZHF1bztJbmRlbW5pZmllZCBDb250cmlidXRvciZyZHF1bzspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKKyAgICAgIChjb2xsZWN0aXZlbHkgJmxkcXVvO0xvc3NlcyZyZHF1bzspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCisgICAgICBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudAorICAgICAgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbgorICAgICAgd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLgorICAgICAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcKKyAgICAgIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0bworICAgICAgcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZQorICAgICAgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorICAgICAgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLAorICAgICAgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQKKyAgICAgIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisgICAgPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0KKyAgICAgIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorICAgICAgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zCisgICAgICBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJiMwMzk7cyByZXNwb25zaWJpbGl0eSBhbG9uZS4KKyAgICAgIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zCisgICAgICBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCisgICAgICB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzCisgICAgICBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJ3YXJyYW50eSI+NS4gTk8gV0FSUkFOVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmbGRxdW87QVMgSVMmcmRxdW87IEJBU0lTLCBXSVRIT1VUCisgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAorICAgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlCisgICAgICByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZQorICAgICAgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgorICAgICAgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZGlzY2xhaW1lciI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2gyPgorICAgIDxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQKKyAgICAgIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWQorICAgICAgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICAgICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCisgICAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAgICAgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCisgICAgICBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iZ2VuZXJhbCI+Ny4gR0VORVJBTDwvaDI+CisgICAgPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKKyAgICAgIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUKKyAgICAgIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZQorICAgICAgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudAorICAgICAgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorICAgIDwvcD4KKyAgICA8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgorICAgICAgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKKyAgICAgIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCYjMDM5O3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyByaWdodHMgZ3JhbnRlZAorICAgICAgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgICAgPC9wPgorICAgIDxwPkFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KKyAgICAgIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQKKyAgICAgIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZworICAgICAgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50JiMwMzk7cyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQorICAgICAgYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQmIzAzOTtzIG9ibGlnYXRpb25zIHVuZGVyCisgICAgICB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZQorICAgICAgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKyAgICA8L3A+CisgICAgPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LAorICAgICAgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5CisgICAgICBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMKKyAgICAgIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodAorICAgICAgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudAorICAgICAgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcworICAgICAgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mCisgICAgICB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KKyAgICAgIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uCisgICAgICBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3CisgICAgICB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZQorICAgICAgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorICAgIDwvcD4KKyAgICA8cD5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKKyAgICAgIHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorICAgICAgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKKyAgICAgIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKKyAgICAgIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAorICAgICAgdG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KKyAgICAgIE5vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJleGhpYml0LWEiPkV4aGliaXQgQSAmbmRhc2g7IEZvcm0gb2YgU2Vjb25kYXJ5IExpY2Vuc2VzIE5vdGljZTwvaDI+CisgICAgPHA+JmxkcXVvO1RoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyAKKyAgICAJU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCAKKyAgICAJaW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAorICAgIAl2ZXJzaW9uKHMpLCBhbmQgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGhlcmV9LiZyZHF1bzsKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cD5TaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgICAgICAgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIHVuZGVyIFNlY29uZGFyeSBMaWNlbnNlcy4KKyAgICAgIDwvcD4KKyAgICAgIDxwPklmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIGZpbGUsCisgICAgICAgIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UgZmlsZSBpbiBhCisgICAgICAgIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yCisgICAgICAgIHN1Y2ggYSBub3RpY2UuCisgICAgICA8L3A+CisgICAgICA8cD5Zb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC48L3A+CisgICAgPC9ibG9ja3F1b3RlPgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5OGFjYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi08IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgYm9keSB7Ci0gICAgc2l6ZTogOC41aW4gMTEuMGluOwotICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKLSAgICB0YWItaW50ZXJ2YWw6IDAuNWluOwotICAgIH0KLSAgcCB7ICAJCi0gICAgbWFyZ2luLWxlZnQ6IGF1dG87Ci0gICAgbWFyZ2luLXRvcDogIDAuNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwotICAgIH0KLSAgcC5saXN0IHsKLSAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKLSAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKLSAgICB9Ci0gIDwvc3R5bGU+Ci0KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotCi08aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKLVBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUwotQUdSRUVNRU5ULjwvcD4KLQotPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgotCi08cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKLWNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgotPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KLTxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQotb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKLUNvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKLVByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCi1Db250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KLWNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQotYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCi10aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKLUNvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQotd2l0aCB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKLW9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKLW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50Ci1saWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAotc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKLWJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgotZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCi1hcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCi1wYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCi1Db250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Ci1hbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1vciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKLWdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgotZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKLXRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKLWhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAotdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCi1mb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKLW9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLWNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKLUFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCi1wYXJ0eTsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKLWZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQotcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQotZXhjaGFuZ2UuPC9wPgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCi1jb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKLXdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCi1saWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKLXRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCi1wb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAotaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQotYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCi1wYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKLWFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCi1vcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQotSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KLWV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+Ci0KLTxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUwotT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKLU9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi10aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAotZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKLWludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKLU5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+Ci0KLTxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCi10aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KLWJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KLWV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQotUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgotc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQotZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAotZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCi1hZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKLXVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKLXJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQotQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQotc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQotZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKLWV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCi1yaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKLXRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKLUFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKLXRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQotdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKLXJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KLQotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2xpY2Vuc2UuaHRtbAppbmRleCA2ZTU3OWE1Li4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL2xpY2Vuc2UuaHRtbApAQCAtMSwxNjQgKzEsMTg5IEBACi08IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5GZWJydWFyeSAxLCAyMDExPC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKLSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCi0gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCi1zb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAotYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKLWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKLW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKLUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKLXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAotbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCi1vZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCi1GZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCi1saXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQotIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAotaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0Ci0gYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKLWZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCi1mb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KLSAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCi1DT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAotb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCi1leGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCi1hbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAotY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCi1wYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKLSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bwotIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKLVRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKLXRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCi1hY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiAKLXdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCAKLWV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi1tYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciAKLXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgCi1Tb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgCi1Tb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQKLSBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgCi11c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gCi1VcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAotd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlCi0gY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCAKLWFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIAotc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgCi10aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3BvbS54bWwKaW5kZXggZmYzZGMxYS4uOTk0OGExZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvcG9tLnhtbApAQCAtMiw5ICsyLDExIEBACiA8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+CiA8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgotPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIC0tPgogPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Ci08IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAtLT4KIDwhLS0jIC0tPgogPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KIDwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL0Fic3RyYWN0U3RyYXRlZ3lEU0xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvQWJzdHJhY3RTdHJhdGVneURTTFVpTW9kdWxlLmphdmEKaW5kZXggNGY1NzhkMC4uNGMwNDYwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvQWJzdHJhY3RTdHJhdGVneURTTFVpTW9kdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvQWJzdHJhY3RTdHJhdGVneURTTFVpTW9kdWxlLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCmluZGV4IGFkZThjNGEuLjEzYTE0ZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9TdHJhdGVneURTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5LmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdFN0cmF0ZWd5RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdFN0cmF0ZWd5RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCmluZGV4IGQ4YmZmN2YuLjhiMGM4MDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RTdHJhdGVneURTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9jb250ZW50YXNzaXN0L0Fic3RyYWN0U3RyYXRlZ3lEU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS5jb250ZW50YXNzaXN0OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9pbnRlcm5hbC9TdHJhdGVneUFjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvaW50ZXJuYWwvU3RyYXRlZ3lBY3RpdmF0b3IuamF2YQppbmRleCA5ODRhYTExLi5hNzYzY2Y3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9pbnRlcm5hbC9TdHJhdGVneUFjdGl2YXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2ludGVybmFsL1N0cmF0ZWd5QWN0aXZhdG9yLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS5pbnRlcm5hbDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9TdHJhdGVneURTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YQppbmRleCA3NzA2MjRmLi44YjY1MWYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9TdHJhdGVneURTTEVPYmplY3RIb3Zlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9TdHJhdGVneURTTEVPYmplY3RIb3Zlci5qYXZhCmluZGV4IGEzZGU1YWQuLmUwYjZhZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFT2JqZWN0SG92ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRU9iamVjdEhvdmVyLmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuamF2YQppbmRleCBlYzBhM2E0Li41Y2FjOTg0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9TdHJhdGVneURTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCmluZGV4IDE1MDEwNjYuLjhmZDAwYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL1N0cmF0ZWd5RFNMVWlNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xVaU1vZHVsZS5qYXZhCmluZGV4IGY3MmM5NTguLmIzOTIzNDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xVaU1vZHVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvU3RyYXRlZ3lEU0xVaU1vZHVsZS5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2NvbnRlbnRhc3Npc3QvU3RyYXRlZ3lEU0xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9jb250ZW50YXNzaXN0L1N0cmF0ZWd5RFNMUHJvcG9zYWxQcm92aWRlci54dGVuZAppbmRleCAwNWY4ZWE5Li4zZmFhYzhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2NvbnRlbnRhc3Npc3QvU3RyYXRlZ3lEU0xQcm9wb3NhbFByb3ZpZGVyLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvY29udGVudGFzc2lzdC9TdHJhdGVneURTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvbGFiZWxpbmcvU3RyYXRlZ3lEU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2xhYmVsaW5nL1N0cmF0ZWd5RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCmluZGV4IDdiMzgzZTUuLmIwOWVjOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvbGFiZWxpbmcvU3RyYXRlZ3lEU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9sYWJlbGluZy9TdHJhdGVneURTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9sYWJlbGluZy9TdHJhdGVneURTTExhYmVsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2xhYmVsaW5nL1N0cmF0ZWd5RFNMTGFiZWxQcm92aWRlci54dGVuZAppbmRleCAwZGY0Y2FiLi4wYjViNTk5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2xhYmVsaW5nL1N0cmF0ZWd5RFNMTGFiZWxQcm92aWRlci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2xhYmVsaW5nL1N0cmF0ZWd5RFNMTGFiZWxQcm92aWRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9vdXRsaW5lL1N0cmF0ZWd5RFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvb3V0bGluZS9TdHJhdGVneURTTE91dGxpbmVUcmVlUHJvdmlkZXIueHRlbmQKaW5kZXggNGZlODA4NS4uYThiYTEwYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9vdXRsaW5lL1N0cmF0ZWd5RFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL291dGxpbmUvU3RyYXRlZ3lEU0xPdXRsaW5lVHJlZVByb3ZpZGVyLnh0ZW5kCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL3F1aWNrZml4L1N0cmF0ZWd5RFNMUXVpY2tmaXhQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvcXVpY2tmaXgvU3RyYXRlZ3lEU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCmluZGV4IDQwNjExZDMuLjhjYWI2N2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvcXVpY2tmaXgvU3RyYXRlZ3lEU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvcXVpY2tmaXgvU3RyYXRlZ3lEU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2NvbnRlbnRhc3Npc3QvU3RyYXRlZ3lEU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2NvbnRlbnRhc3Npc3QvU3RyYXRlZ3lEU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKaW5kZXggNjE5ODM5Mi4uNGJkZmY0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9jb250ZW50YXNzaXN0L1N0cmF0ZWd5RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvY29udGVudGFzc2lzdC9TdHJhdGVneURTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9sYWJlbGluZy9TdHJhdGVneURTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9sYWJlbGluZy9TdHJhdGVneURTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDhiZTgxZjUuLjhjY2E4YTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvbGFiZWxpbmcvU3RyYXRlZ3lEU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2xhYmVsaW5nL1N0cmF0ZWd5RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvbGFiZWxpbmcvU3RyYXRlZ3lEU0xMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL2xhYmVsaW5nL1N0cmF0ZWd5RFNMTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDFjMTYyNjUuLmE2YmNjZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvbGFiZWxpbmcvU3RyYXRlZ3lEU0xMYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9sYWJlbGluZy9TdHJhdGVneURTTExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9vdXRsaW5lL1N0cmF0ZWd5RFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9vdXRsaW5lL1N0cmF0ZWd5RFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhCmluZGV4IDQwMGRjMjcuLmRkN2NkN2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvb3V0bGluZS9TdHJhdGVneURTTE91dGxpbmVUcmVlUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL291dGxpbmUvU3RyYXRlZ3lEU0xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvcXVpY2tmaXgvU3RyYXRlZ3lEU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3VpL3F1aWNrZml4L1N0cmF0ZWd5RFNMUXVpY2tmaXhQcm92aWRlci5qYXZhCmluZGV4IGNiODRhYjIuLjdkNTZhNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdWkvcXVpY2tmaXgvU3RyYXRlZ3lEU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91aS9xdWlja2ZpeC9TdHJhdGVneURTTFF1aWNrZml4UHJvdmlkZXIuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvTElDRU5TRS50eHQKaW5kZXggZmY0MmFkNC4uZmM1OTM4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9MSUNFTlNFLnR4dAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L0xJQ0VOU0UudHh0CkBAIC0xLDE2MSArMSwxNDAgQEAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCitFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQKIAotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCi1PUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KK05vdmVtYmVyIDIyLCAyMDE3CiAKLTEuIERFRklOSVRJT05TCitVc2FnZSBPZiBDb250ZW50CiAKLSJDb250cmlidXRpb24iIG1lYW5zOgorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRgorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVECitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVQorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuCiAKLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKK0FwcGxpY2FibGUgTGljZW5zZXMKIAotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCiAKLWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24KK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeQorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLgogCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5CisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4KKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYQorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heQorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS4KKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLgogCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLUEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCi1tb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90Ci1kZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4KK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIgorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCitsb2NhdGlvbnM6CiAKLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcworLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnMKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zCistICAgRmVhdHVyZSBkaXJlY3RvcmllcwogCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKLWl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdQord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91Cit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIgorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LgogCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6CiAKLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKQorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbCkKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKQorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKQogCi0yLiBHUkFOVCBPRiBSSUdIVFMKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8KK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcworcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC4KIAotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKLWFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKIAotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCi1jb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKLWFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAotYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseQorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24KK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuCiAKLWMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubwotYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQotYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlCitmb2xsb3dpbmc6CiAKLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCi1ncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5CisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZQorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8KKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZQorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZQorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZQorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLgogCi0zLiBSRVFVSVJFTUVOVFMKK0NyeXB0b2dyYXBoeQogCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCiAKLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZwotd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLWluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQotb3RoZXIgcGFydHk7IGFuZAotCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0Ci1pbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCi10aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCi1vdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKLWJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKLSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCi0KLUZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwotdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKLXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgotVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCi0KLTUuIE5PIFdBUlJBTlRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCi1OT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKLWRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCi13aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCi0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKLUhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLU9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAotcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCi0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCi1SZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKLWxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCi1ub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgotb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCi0gZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAotaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKLW5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCi1yaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQotZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKLW5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCi0KLVRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCi1vZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKLW9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZQorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9hYm91dC5odG1sCmluZGV4IDY0YzA1OTguLmU4YjgzNGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvYWJvdXQuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2Fib3V0Lmh0bWwKQEAgLTgsMTMgKzgsMTMgQEAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIDxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgogIAotPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxwPk5vdmVtYmVyIDMwLCAyMDE3PC9wPgkKIDxoMz5MaWNlbnNlPC9oMz4KIAogPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCiBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CiAKIDxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2Fib3V0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2Fib3V0LnByb3BlcnRpZXMKaW5kZXggYTc5ZTQ4MC4uNTQ1ZWNjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9hYm91dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvYWJvdXQucHJvcGVydGllcwpAQCAtMSw5ICsxLDExIEBACiAjCiAjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKEhlaWRlbGJlcmcpCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogIwogIyBDb250cmlidXRvcnM6CiAjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCkBAIC0xNyw5ICsxOSwxMSBAQAogZmVhdHVyZVRleHQ9XAogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIFxuXAogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCBcblwKIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAoraHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cblwKK1xuXAorU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcblwKIFxuXAogQ29udHJpYnV0b3JzOlxuXAogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvblxuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2J1aWxkLnByb3BlcnRpZXMKaW5kZXggYjQ1OTk2My4uMzAxOWRhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvYnVpbGQucHJvcGVydGllcwpAQCAtMTEsOCArMTEsOCBAQAogICAgICAgICAgICAgICAgbW9kZWwvLFwKICAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCiAgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKKyAgICAgICAgICAgICAgIGVwbC0yLjAuaHRtbAogc3JjLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIGxpY2Vuc2UuaHRtbCxcCiAgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwJCQkgICAKKyAgICAgICAgICAgICAgIGVwbC0yLjAuaHRtbAkJCSAgIAogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9Gb2N1c2luZ0VuaGFuY2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9Gb2N1c2luZ0VuaGFuY2VyLmphdmEKaW5kZXggMWNlNjg2Ni4uOTZlMGJkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvRm9jdXNpbmdFbmhhbmNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0ZvY3VzaW5nRW5oYW5jZXIuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9zZSBDLiBEb21pbmd1ZXogLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9Gb2N1c2luZ0VudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0ZvY3VzaW5nRW51bS5qYXZhCmluZGV4IGEwNGE5ZjYuLmY1NDY1YTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0ZvY3VzaW5nRW51bS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0ZvY3VzaW5nRW51bS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0ZvY3VzaW5nU3RyYXRlZ3kuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0ZvY3VzaW5nU3RyYXRlZ3kuamF2YQppbmRleCBlY2NlZWE0Li5mNzZiOTFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9Gb2N1c2luZ1N0cmF0ZWd5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvRm9jdXNpbmdTdHJhdGVneS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0xheW91dGluZ0VudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0xheW91dGluZ0VudW0uamF2YQppbmRleCAwOTczNjg2Li5jZGQ0ZThjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9MYXlvdXRpbmdFbnVtLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvTGF5b3V0aW5nRW51bS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KQEAgLTYwLDYgKzYyLDE2IEBACiAJR1JJRCgwLCAiR1JJRCIsICJHcmlkIiksCiAKIAkvKioKKwkgKiBUaGUgJzxlbT48Yj5GT1JNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0ZPUk1fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlGT1JNKDAsICJGT1JNIiwgIkZvcm0iKSwKKworCS8qKgogCSAqIFRoZSAnPGVtPjxiPkZPUk0yPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTM1LDYgKzE0NywyMSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSSURfVkFMVUUgPSAwOwogCiAJLyoqCisJICogVGhlICc8ZW0+PGI+Rk9STTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Rk9STTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNGT1JNCisJICogQG1vZGVsIGxpdGVyYWw9IkZvcm0iCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STV9WQUxVRSA9IDA7CisKKwkvKioKIAkgKiBUaGUgJzxlbT48Yj5GT1JNMjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMTkwLDYgKzIxNyw3IEBACiAJCQlIT1JJWk9OVEFMLAogCQkJVkVSVElDQUwsCiAJCQlHUklELAorCQkJRk9STSwKIAkJCUZPUk0yLAogCQkJRk9STTMsCiAJCQlDU1MsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9MYXlvdXRpbmdTdHJhdGVneS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvTGF5b3V0aW5nU3RyYXRlZ3kuamF2YQppbmRleCA1OWEyNWI0Li5kYTkxM2Y0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9MYXlvdXRpbmdTdHJhdGVneS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0xheW91dGluZ1N0cmF0ZWd5LmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3kuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5LmphdmEKaW5kZXggZmI4YTE4OS4uOTYwMWMwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3kuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5QmFzZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lCYXNlLmphdmEKaW5kZXggOTg2MzM3Zi4uMGZkYzEyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lCYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lCYXNlLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEU0xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTEZhY3RvcnkuamF2YQppbmRleCAzNzIwZDQxLi5iYjdiNTJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTEZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTEZhY3RvcnkuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9zZSBDLiBEb21pbmd1ZXogLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTFBhY2thZ2UuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMUGFja2FnZS5qYXZhCmluZGV4IDIyNTdkNmEuLjFjNWQ1NjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMUGFja2FnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMUGFja2FnZS5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KQEAgLTM3LDcgKzM5LDkgQEAKICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LlN0cmF0ZWd5RFNMRmFjdG9yeQogICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiAgICAgICAgYW5ub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCBmaWxlRXh0ZW5zaW9ucz0nc3RyYXRlZ3knIG1vZGVsTmFtZT0nU3RyYXRlZ3lEU0wnIHByZWZpeD0nU3RyYXRlZ3lEU0wnIHVwZGF0ZUNsYXNzcGF0aD0nZmFsc2UnIGxvYWRJbml0aWFsaXphdGlvbj0nZmFsc2UnIGxpdGVyYWxzSW50ZXJmYWNlPSd0cnVlJyBjb3B5cmlnaHRUZXh0PSdDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KVxyXG4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBcclxuIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBcclxuIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IFxyXG4gaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgXHJcblxyXG4gQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlXHJcbiAgXHJcbiBDb250cmlidXRvcnN7ICBcclxuIFx0XHRKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gXHJcbiAnIGJhc2VQYWNrYWdlPSdvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0JyIKK24gaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gXHJcblxyXG4gQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlXHJcbiAgXHJcbiBDb250cmlidXRvcnM6ICBcclxuIFx0XHRKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gXHJcbiAnIGJhc2VQYWNrYWdlPSdvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0JyIKK24gXHJcblxyXG4gQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlXHJcbiAgXHJcbiBDb250cmlidXRvcnM6ICBcclxuIFx0XHRKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gXHJcbiAnIGJhc2VQYWNrYWdlPSdvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0JyIKK24gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgXHJcblxyXG4gQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlXHJcbiAgXHJcbiBDb250cmlidXRvcnM6ICBcclxuIFx0XHRKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gXHJcbiAnIGJhc2VQYWNrYWdlPSdvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0JyIKICAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIHJvb3RQYWNrYWdlPSdzdHJhdGVneWRzbCciCiAgKiBAZ2VuZXJhdGVkCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RGVmYXVsdC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEZWZhdWx0LmphdmEKaW5kZXggMDRlNGFmOC4uZmUwODg1NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEZWZhdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEZWZhdWx0LmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lMYXp5UmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5TGF6eVJlc29sdmVyLmphdmEKaW5kZXggNDE4NTMxNy4uZGIwNzZlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lMYXp5UmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneUxhenlSZXNvbHZlci5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5TW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5TW9kZWwuamF2YQppbmRleCAyMDgxZjUwLi4yNzQ4MmY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneU1vZGVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lNb2RlbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5UGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lQYWNrYWdlLmphdmEKaW5kZXggYmQwY2YyNC4uZGIwMjY1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lQYWNrYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lQYWNrYWdlLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lUYXJnZXQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5VGFyZ2V0LmphdmEKaW5kZXggZDVhZmQxZS4uYzhlMGY5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lUYXJnZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneVRhcmdldC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvRm9jdXNpbmdFbmhhbmNlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvRm9jdXNpbmdFbmhhbmNlckltcGwuamF2YQppbmRleCAwOGQzNWNhLi5lZTVlZWUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL0ZvY3VzaW5nRW5oYW5jZXJJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9Gb2N1c2luZ0VuaGFuY2VySW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvRm9jdXNpbmdTdHJhdGVneUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvRm9jdXNpbmdTdHJhdGVneUltcGwuamF2YQppbmRleCA3NjE2ODkwLi43N2E5Mjc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL0ZvY3VzaW5nU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9Gb2N1c2luZ1N0cmF0ZWd5SW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvTGF5b3V0aW5nU3RyYXRlZ3lJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL0xheW91dGluZ1N0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDMxMzhmODIuLmU1ZTVjZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvTGF5b3V0aW5nU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9MYXlvdXRpbmdTdHJhdGVneUltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9zZSBDLiBEb21pbmd1ZXogLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5QmFzZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lCYXNlSW1wbC5qYXZhCmluZGV4IGFlODZjNDcuLmZlOGExZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lCYXNlSW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lCYXNlSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lEU0xGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneURTTEZhY3RvcnlJbXBsLmphdmEKaW5kZXggZWM4ODNjNS4uZTY4NjNkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneURTTEZhY3RvcnlJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneURTTEZhY3RvcnlJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneURTTFBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5RFNMUGFja2FnZUltcGwuamF2YQppbmRleCAwOTkzMDdkLi4xMmNhNWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5RFNMUGFja2FnZUltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5RFNMUGFja2FnZUltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9zZSBDLiBEb21pbmd1ZXogLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCkBAIC02NTUsNiArNjU3LDcgQEAKIAkJYWRkRUVudW1MaXRlcmFsKGxheW91dGluZ0VudW1FRW51bSwgTGF5b3V0aW5nRW51bS5IT1JJWk9OVEFMKTsKIAkJYWRkRUVudW1MaXRlcmFsKGxheW91dGluZ0VudW1FRW51bSwgTGF5b3V0aW5nRW51bS5WRVJUSUNBTCk7CiAJCWFkZEVFbnVtTGl0ZXJhbChsYXlvdXRpbmdFbnVtRUVudW0sIExheW91dGluZ0VudW0uR1JJRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChsYXlvdXRpbmdFbnVtRUVudW0sIExheW91dGluZ0VudW0uRk9STSk7CiAJCWFkZEVFbnVtTGl0ZXJhbChsYXlvdXRpbmdFbnVtRUVudW0sIExheW91dGluZ0VudW0uRk9STTIpOwogCQlhZGRFRW51bUxpdGVyYWwobGF5b3V0aW5nRW51bUVFbnVtLCBMYXlvdXRpbmdFbnVtLkZPUk0zKTsKIAkJYWRkRUVudW1MaXRlcmFsKGxheW91dGluZ0VudW1FRW51bSwgTGF5b3V0aW5nRW51bS5DU1MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneURlZmF1bHRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5RGVmYXVsdEltcGwuamF2YQppbmRleCBlZDQ2M2FiLi42NjFjYWZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5RGVmYXVsdEltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5RGVmYXVsdEltcGwuamF2YQpAQCAtMSwxMyArMSwxNSBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAqIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIAogICogCiAgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCiAgKiAgIAotICogIENvbnRyaWJ1dG9yc3sgIAorICogIENvbnRyaWJ1dG9yczogIAogICogIAkJSm9zZSBDLiBEb21pbmd1ZXogLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAogICogIAogICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneUltcGwuamF2YQppbmRleCBmODMyMTk2Li44YzZhMGEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneUxhenlSZXNvbHZlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lMYXp5UmVzb2x2ZXJJbXBsLmphdmEKaW5kZXggZjRiNmRkZi4uYWQ1Y2VjNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneUxhenlSZXNvbHZlckltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5TGF6eVJlc29sdmVySW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lNb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lNb2RlbEltcGwuamF2YQppbmRleCBiZDYxMmQ5Li5kOTFmNWY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5TW9kZWxJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneU1vZGVsSW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneVBhY2thZ2VJbXBsLmphdmEKaW5kZXggOGM2NmJlNi4uNTI1NTM2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneVBhY2thZ2VJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneVBhY2thZ2VJbXBsLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneVRhcmdldEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcGwvU3RyYXRlZ3lUYXJnZXRJbXBsLmphdmEKaW5kZXggZTY1YzhhYi4uMDVmN2M5ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wbC9TdHJhdGVneVRhcmdldEltcGwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9pbXBsL1N0cmF0ZWd5VGFyZ2V0SW1wbC5qYXZhCkBAIC0xLDEzICsxLDE1IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHB7Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvIAorICogCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgCiAgKiAKICAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKICAqICAgCi0gKiAgQ29udHJpYnV0b3JzeyAgCisgKiAgQ29udHJpYnV0b3JzOiAgCiAgKiAgCQlKb3NlIEMuIERvbWluZ3VleiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCiAgKiAgCiAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3V0aWwvU3RyYXRlZ3lEU0xBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdXRpbC9TdHJhdGVneURTTEFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggYjA5YTM4MC4uNzk3MWY1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdXRpbC9TdHJhdGVneURTTEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdXRpbC9TdHJhdGVneURTTEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdXRpbC9TdHJhdGVneURTTFN3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdXRpbC9TdHJhdGVneURTTFN3aXRjaC5qYXZhCmluZGV4IDI1Yzg4ZjIuLjUwYTg1MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3V0aWwvU3RyYXRlZ3lEU0xTd2l0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS91dGlsL1N0cmF0ZWd5RFNMU3dpdGNoLmphdmEKQEAgLTEsMTMgKzEsMTUgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gCisgKiAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKICAqIAogICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICogICAKLSAqICBDb250cmlidXRvcnN7ICAKKyAqICBDb250cmlidXRvcnM6ICAKICAqICAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKICAqICAKICAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lcGwtMi4wLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VwbC0yLjAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9lcGwtMi4wLmh0bWwKQEAgLTAsMCArMSwzMDAgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDIuMDwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBtYXJnaW46IDEuNWVtIDNlbTsKKyAgICAgIH0KKyAgICAgIGgxeworICAgICAgICBmb250LXNpemU6MS41ZW07CisgICAgICB9CisgICAgICBoMnsKKyAgICAgICAgZm9udC1zaXplOjFlbTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTowLjVlbTsKKyAgICAgICAgbWFyZ2luLXRvcDoxZW07CisgICAgICB9CisgICAgICBwIHsKKyAgICAgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICAgIH0KKyAgICAgIHVsLCBvbHsKKyAgICAgICAgbGlzdC1zdHlsZS10eXBlOm5vbmU7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wPC9oMT4KKyAgICA8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgICAgUFVCTElDIExJQ0VOU0UgKCZsZHF1bztBR1JFRU1FTlQmcmRxdW87KS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgICAgT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJiMwMzk7UyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImRlZmluaXRpb25zIj4xLiBERUZJTklUSU9OUzwvaDI+CisgICAgPHA+JmxkcXVvO0NvbnRyaWJ1dGlvbiZyZHF1bzsgbWVhbnM6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9saT4KKyAgICAgICAgICA8bGk+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICAgICAgICBhbmQgYXJlIERpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24KKyAgICAgICAgJmxkcXVvO29yaWdpbmF0ZXMmcmRxdW87IGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaAorICAgICAgICBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJiMwMzk7cyBiZWhhbGYuCisgICAgICAgIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gdGhhdAorICAgICAgICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPiZsZHF1bztDb250cmlidXRvciZyZHF1bzsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3A+CisgICAgPHA+JmxkcXVvO0xpY2Vuc2VkIFBhdGVudHMmcmRxdW87IG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKKyAgICAgIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKKyAgICAgIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1Byb2dyYW0mcmRxdW87IG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCisgICAgICBBZ3JlZW1lbnQuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztSZWNpcGllbnQmcmRxdW87IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKKyAgICAgIG9yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisgICAgPC9wPgorICAgIDxwPiZsZHF1bztEZXJpdmF0aXZlIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO01vZGlmaWVkIFdvcmtzJnJkcXVvOyBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorICAgICAgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgICBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKKyAgICAgIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCisgICAgICBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsIGludGVyZmFjZXMsCisgICAgICB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5IGluIGVhY2ggY2FzZQorICAgICAgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbSBvciBNb2RpZmllZAorICAgICAgV29ya3MgdGhlcmVvZi4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO0Rpc3RyaWJ1dGUmcmRxdW87IG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCisgICAgICBpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorICAgIDwvcD4KKyAgICA8cD4mbGRxdW87U291cmNlIENvZGUmcmRxdW87IG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworICAgICAgbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKKyAgICAgIGRvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICA8L3A+CisgICAgPHA+JmxkcXVvO1NlY29uZGFyeSBMaWNlbnNlJnJkcXVvOyBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgICAgVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKKyAgICAgIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCisgICAgICBDb250cmlidXRvci4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJncmFudC1vZi1yaWdodHMiPjIuIEdSQU5UIE9GIFJJR0hUUzwvaDI+CisgICAgPHVsPgorICAgICAgPGxpPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0CisgICAgICAgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgICAgICAgIHB1YmxpY2x5IHBlcmZvcm0sIERpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCisgICAgICAgIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MuCisgICAgICA8L2xpPgorICAgICAgPGxpPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICAgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgICAgICAgIGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsCisgICAgICAgIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwKKyAgICAgICAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgICAgICAgIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwKKyAgICAgICAgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKKyAgICAgICAgYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCisgICAgICAgIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQorICAgICAgICBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIKKyAgICAgICAgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgICAgICAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgICAgICAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgICAgICAgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgICAgICAgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgICAgICAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgICAgICAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzCisgICAgICAgIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQorICAgICAgICByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLAorICAgICAgICBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvCisgICAgICAgIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQmIzAzOTtzCisgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisgICAgICA8L2xpPgorICAgICAgPGxpPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKKyAgICAgICAgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQKKyAgICAgICAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisgICAgICA8L2xpPgorICAgICAgPGxpPmUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubyBDb250cmlidXRvcgorICAgICAgICBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyB0byBhbnkgUmVjaXBpZW50IChvdGhlciB0aGFuIHRob3NlIHNldCBmb3J0aAorICAgICAgICBpbiB0aGlzIEFncmVlbWVudCkgYXMgYSByZXN1bHQgb2Ygc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJlY2VpcHQgb2YgdGhlCisgICAgICAgIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UgKGlmIHBlcm1pdHRlZCB1bmRlcgorICAgICAgICB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+My4gUkVRVUlSRU1FTlRTPC9oMj4KKyAgICA8cD4zLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPmEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgICAgICAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgICAgICAgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgICAgICAgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgICAgICAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICAgICAgICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgICAgICAgIGRpZmZlcmVudCB0aGFuIHRoaXMgQWdyZWVtZW50LCBwcm92aWRlZCB0aGF0IHN1Y2ggbGljZW5zZToKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcworICAgICAgICAgICAgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgICAgICAgIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwKKyAgICAgICAgICAgIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPGxpPmlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyYjMDM5OyByaWdodHMgaW4gdGhlCisgICAgICAgICAgICBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+aXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkgcGFydHkKKyAgICAgICAgICAgIHRvIGJlIHVuZGVyIGEgbGljZW5zZSB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgc2VjdGlvbiAzLgorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+My4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6PC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBvciBpZiB0aGUgUHJvZ3JhbSAoaSkKKyAgICAgICAgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IgZmlsZXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdW5kZXIgYSBTZWNvbmRhcnkgTGljZW5zZSwgYW5kIChpaSkgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgYXR0YWNoZWQgdG8KKyAgICAgICAgdGhlIFNvdXJjZSBDb2RlIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwKKyAgICAgICAgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2gKKyAgICAgICAgU2Vjb25kYXJ5IExpY2Vuc2VzLCBhbmQKKyAgICAgIDwvbGk+CisgICAgICA8bGk+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9saT4KKyAgICA8L3VsPgorICAgIDxwPjMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssCisgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwgb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5CisgICAgICAoJmxzcXVvO25vdGljZXMmcnNxdW87KSBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtIGZyb20gYW55IGNvcHkgb2YgdGhlIFByb2dyYW0gd2hpY2gKKyAgICAgIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZCB0aGVpciBvd24gYXBwcm9wcmlhdGUKKyAgICAgIG5vdGljZXMuCisgICAgPC9wPgorICAgIDxoMiBpZD0iY29tbWVyY2lhbC1kaXN0cmlidXRpb24iPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9oMj4KKyAgICA8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcworICAgICAgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCisgICAgICBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUKKyAgICAgIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQKKyAgICAgIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlcgorICAgICAgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYQorICAgICAgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmbGRxdW87Q29tbWVyY2lhbCBDb250cmlidXRvciZyZHF1bzspCisgICAgICBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisgICAgICAoJmxkcXVvO0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnJkcXVvOykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworICAgICAgKGNvbGxlY3RpdmVseSAmbGRxdW87TG9zc2VzJnJkcXVvOykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKKyAgICAgIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50CisgICAgICBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uCisgICAgICB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuCisgICAgICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZworICAgICAgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvCisgICAgICBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlCisgICAgICBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCisgICAgICBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sCisgICAgICB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZAorICAgICAgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKyAgICA8L3A+CisgICAgPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbQorICAgICAgaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKKyAgICAgIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCisgICAgICBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMKKyAgICAgIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3ImIzAzOTtzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorICAgICAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMKKyAgICAgIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKKyAgICAgIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMKKyAgICAgIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorICAgIDwvcD4KKyAgICA8aDIgaWQ9IndhcnJhbnR5Ij41LiBOTyBXQVJSQU5UWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZsZHF1bztBUyBJUyZyZHF1bzsgQkFTSVMsIFdJVEhPVVQKKyAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCisgICAgICBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUKKyAgICAgIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlCisgICAgICB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCisgICAgICBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJkaXNjbGFpbWVyIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvaDI+CisgICAgPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRAorICAgICAgQlkgQVBQTElDQUJMRSBMQVcsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZCisgICAgICBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksCisgICAgICBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKKyAgICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgICAgICBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKKyAgICAgIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAgICA8L3A+CisgICAgPGgyIGlkPSJnZW5lcmFsIj43LiBHRU5FUkFMPC9oMj4KKyAgICA8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorICAgICAgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZQorICAgICAgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlCisgICAgICBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50CisgICAgICBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisgICAgPC9wPgorICAgIDxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmCisgICAgICAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQorICAgICAgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50JiMwMzk7cyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyBncmFudGVkCisgICAgICB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAgICA8L3A+CisgICAgPHA+QWxsIFJlY2lwaWVudCYjMDM5O3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bworICAgICAgY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZAorICAgICAgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nCisgICAgICBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQmIzAzOTtzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAorICAgICAgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtCisgICAgICBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCYjMDM5O3Mgb2JsaWdhdGlvbnMgdW5kZXIKKyAgICAgIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlCisgICAgICBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorICAgIDwvcD4KKyAgICA8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgICBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkKKyAgICAgIG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcworICAgICAgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudAorICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0CisgICAgICB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50CisgICAgICBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzCisgICAgICB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YKKyAgICAgIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQorICAgICAgKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIERpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24KKyAgICAgIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKKyAgICAgIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBEaXN0cmlidXRlCisgICAgICB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uCisgICAgPC9wPgorICAgIDxwPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorICAgICAgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55CisgICAgICBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAorICAgICAgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAorICAgICAgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IGlzIGludGVuZGVkCisgICAgICB0byBiZSBlbmZvcmNlYWJsZSBieSBhbnkgZW50aXR5IHRoYXQgaXMgbm90IGEgQ29udHJpYnV0b3Igb3IgUmVjaXBpZW50LgorICAgICAgTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorICAgIDwvcD4KKyAgICA8aDIgaWQ9ImV4aGliaXQtYSI+RXhoaWJpdCBBICZuZGFzaDsgRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlPC9oMj4KKyAgICA8cD4mbGRxdW87VGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIAorICAgIAlTZWNvbmRhcnkgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIAorICAgIAlpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IHtuYW1lIGxpY2Vuc2UocyksCisgICAgCXZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uJnJkcXVvOworICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwPlNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgICAgICAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorICAgICAgPC9wPgorICAgICAgPHA+SWYgaXQgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSB0byBwdXQgdGhlIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIgZmlsZSwKKyAgICAgICAgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRSBmaWxlIGluIGEKKyAgICAgICAgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3IKKyAgICAgICAgc3VjaCBhIG5vdGljZS4KKyAgICAgIDwvcD4KKyAgICAgIDxwPllvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzk4YWNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICBib2R5IHsKLSAgICBzaXplOiA4LjVpbiAxMS4waW47Ci0gICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOwotICAgIHRhYi1pbnRlcnZhbDogMC41aW47Ci0gICAgfQotICBwIHsgIAkKLSAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICBtYXJnaW4tdG9wOiAgMC41ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0gICAgfQotICBwLmxpc3QgewotICAJbWFyZ2luLWxlZnQ6IDAuNWluOwotICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOwotICAgIH0KLSAgPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQotUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTCi1BR1JFRU1FTlQuPC9wPgotCi08cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKLXRoZSBQcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cwotQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcwotb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAotb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKLWxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCi1zdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAotYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCi1ncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKLWFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAotaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Ci10aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKLWZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcwotb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgotY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcwotQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKLXBhcnR5OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQotZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCi1yZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCi1leGNoYW5nZS48L3A+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKLWNvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKLWxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgotdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKLXBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCi1pbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpCi1hcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKLXBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQotYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KLW9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCi1JbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgotZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKLWNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKLWFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KLWRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKLXBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCi1Db250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi1tdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KLQotPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TCi1PRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKLUFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWQotT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKLWV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLXRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsCi1kYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvcgotaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAotTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLUlOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKLVdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECi1IRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHA+PGI+Ny4gR0VORVJBTDwvYj48L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKLXRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbgotYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bQotZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+Ci0KLTxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQotKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCi1Qcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyCi1zb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlCi1kYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0Ci1mYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKLWFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwotdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+Ci0KLTxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZwotcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCi1BZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKLUZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Ci1hc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCi1zdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCi1naXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcwotZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KLXJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKLW90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcwotQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQKLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eQotdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlCi10aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cwotcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9wPgotCi0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvbGljZW5zZS5odG1sCmluZGV4IDZlNTc5YTUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvbGljZW5zZS5odG1sCkBAIC0xLDE2NCArMSwxODkgQEAKLTwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQotIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KLSBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKLXNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCi1hdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIAotZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIAotbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmIzg0ODI7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIAotRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIAotc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgCi1uYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyAKLW9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCAKLUZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSAKLWxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55Ci0gZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCi1pbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKLSBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAotRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAotZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKLWZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiAKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLgotICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKLUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCi1vciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCAKLWV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiAKLWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgCi1jYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCAKLXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAotIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCi0gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAotVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCi1UZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAotdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKLWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAotd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAotZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKLW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAotdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKLVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAotIGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKLXVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKLVVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCi13aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKLSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAotYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCi1zb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKLXRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvbW9kZWwvU3RyYXRlZ3lEU0wueGNvcmUgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L21vZGVsL1N0cmF0ZWd5RFNMLnhjb3JlCmluZGV4IDUyODAxNzMuLmVhZGM2NTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvbW9kZWwvU3RyYXRlZ3lEU0wueGNvcmUKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9tb2RlbC9TdHJhdGVneURTTC54Y29yZQpAQCAtNywxNCArNywxNyBAQAogQEdlbk1vZGVsKGxpdGVyYWxzSW50ZXJmYWNlPSJ0cnVlIikKIEBHZW5Nb2RlbChjb3B5cmlnaHRUZXh0PSJDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAKICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwey8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAKKyAKKyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAKIAogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQogICAKLSBDb250cmlidXRvcnN7ICAKLSAJCUpvc2UgQy4gRG9taW5ndWV6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyBDb250cmlidXRvcnM6ICAKKwkJTG9ldHogR21iSCZDby5LRyAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAJCUpvc2UgQy4gRG9taW5ndWV6IC0gb25nb2luZyBkZXZlbG9wbWVudCAKICAiKQogQEVjb3JlKG5zVVJJPSJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTCIpCiBARWNvcmUobnNQcmVmaXg9InN0cmF0ZWd5ZHNsIikKQEAgLTQ1LDE2ICs0OCwxNiBAQAogCVN0cmluZyBuYW1lCiB9CiAKLWNsYXNzIFN0cmF0ZWd5UGFja2FnZSBleHRlbmRzIExQYWNrYWdleworY2xhc3MgU3RyYXRlZ3lQYWNrYWdlIGV4dGVuZHMgTFBhY2thZ2UgewogCWNvbnRhaW5zIFN0cmF0ZWd5IHN0cmF0ZWd5CiB9CiAKLWNsYXNzIFN0cmF0ZWd5eworY2xhc3MgU3RyYXRlZ3kgewogCWNvbnRhaW5zIFN0cmF0ZWd5VGFyZ2V0IHRhcmdldHMKIAljb250YWlucyBTdHJhdGVneURlZmF1bHQgc3RyYXRlZ3lEZWZhdWx0CiB9CiAKLWNsYXNzIFN0cmF0ZWd5VGFyZ2V0eworY2xhc3MgU3RyYXRlZ3lUYXJnZXQgewogCWNvbnRhaW5zIExheW91dGluZ1N0cmF0ZWd5W10gbGF5b3V0aW5nU3RyYXRlZ2llcwogCWNvbnRhaW5zIEZvY3VzaW5nU3RyYXRlZ3lbXSBmb2N1c2luZ1N0cmF0ZWdpZXMKIAljb250YWlucyBGb2N1c2luZ0VuaGFuY2VyW10gZm9jdXNpbmdFbmhhbmNlcgpAQCAtODIsMjEgKzg1LDE2IEBACiB9CiAKIGVudW0gTGF5b3V0aW5nRW51bXsKLQlIT1JJWk9OVEFMIGFzJ0hvcml6b250YWwnCi0JLAotCVZFUlRJQ0FMIGFzICdWZXJ0aWNhbCcKLQksCi0JR1JJRCBhcyAnR3JpZCcKLQksCi0JRk9STTIgYXMgJ0Zvcm0yJwotCSwKLQlGT1JNMyBhcyAnRm9ybTMnCi0JLAorCUhPUklaT05UQUwgYXMnSG9yaXpvbnRhbCcsCisJVkVSVElDQUwgYXMgJ1ZlcnRpY2FsJywKKwlHUklEIGFzICdHcmlkJywKKwlGT1JNIGFzICdGb3JtJywKKwlGT1JNMiBhcyAnRm9ybTInLAorCUZPUk0zIGFzICdGb3JtMycsCiAJQ1NTIGFzICdDc3MnCiB9CiAKIGVudW0gRm9jdXNpbmdFbnVtewotCUZPUldBUkQgYXMgJ0ZvcndhcmQnCi0JLAorCUZPUldBUkQgYXMgJ0ZvcndhcmQnLAogCUJBQ0tXQVJEIGFzICdCYWNrd2FyZCcKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L25vdGljZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9ub3RpY2UuaHRtbAppbmRleCBjM2QzNGMzLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L25vdGljZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvbm90aWNlLmh0bWwKQEAgLTcsMTAxICs3LDE4MyBAQAogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3BvbS54bWwKaW5kZXggNjE1YWZjNC4uNWQ4NDY5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvcG9tLnhtbApAQCAtMiw5ICsyLDExIEBACiA8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+CiA8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgotPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIC0tPgogPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Ci08IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAtLT4KIDwhLS0jIC0tPgogPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KIDwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0Fic3RyYWN0U3RyYXRlZ3lEU0xSdW50aW1lTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9BYnN0cmFjdFN0cmF0ZWd5RFNMUnVudGltZU1vZHVsZS5qYXZhCmluZGV4IDM0NTJjODUuLmI5YjBjYzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0Fic3RyYWN0U3RyYXRlZ3lEU0xSdW50aW1lTW9kdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvQWJzdHJhY3RTdHJhdGVneURTTFJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTC54dGV4dGJpbiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMLnh0ZXh0YmluCmluZGV4IDVjOWQ3MjguLjczOWViODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMLnh0ZXh0YmluCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMLnh0ZXh0YmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhCmluZGV4IDc2YmRkMzUuLmFhNDYyN2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvU3RyYXRlZ3lEU0xBbnRsclRva2VuRmlsZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvU3RyYXRlZ3lEU0xBbnRsclRva2VuRmlsZVByb3ZpZGVyLmphdmEKaW5kZXggNWNiYmE3MC4uYTVhMzZjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL1N0cmF0ZWd5RFNMQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9TdHJhdGVneURTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnBhcnNlci5hbnRscjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL1N0cmF0ZWd5RFNMUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvU3RyYXRlZ3lEU0xQYXJzZXIuamF2YQppbmRleCBiMjE1Y2QwLi5jMzRjYmQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvU3RyYXRlZ3lEU0xQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvU3RyYXRlZ3lEU0xQYXJzZXIuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnBhcnNlci5hbnRscjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMLmcKaW5kZXggNDQ1YzdkYy4uNDFlODQ5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0wuZworKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTC5nCkBAIC03NjM3LDI2ICs3NjM3LDM0IEBACiAJCSkKIAkJICAgIHwKIAkJKAotCQkJZW51bUxpdGVyYWxfMz0nRm9ybTInCisJCQllbnVtTGl0ZXJhbF8zPSdGb3JtJwogCQkJewotCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7Ci0JCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMywgZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7CisJCQkJJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRGT1JNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzMsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7CiAJCQl9CiAJCSkKIAkJICAgIHwKIAkJKAotCQkJZW51bUxpdGVyYWxfND0nRm9ybTMnCisJCQllbnVtTGl0ZXJhbF80PSdGb3JtMicKIAkJCXsKLQkJCQkkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOwotCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzQsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNCwgZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7CiAJCQl9CiAJCSkKIAkJICAgIHwKIAkJKAotCQkJZW51bUxpdGVyYWxfNT0nQ3NzJworCQkJZW51bUxpdGVyYWxfNT0nRm9ybTMnCiAJCQl7Ci0JCQkJJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7Ci0JCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNSwgZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Q1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNSwgZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSk7CisJCQl9CisJCSkKKwkJICAgIHwKKwkJKAorCQkJZW51bUxpdGVyYWxfNj0nQ3NzJworCQkJeworCQkJCSRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Q1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzYsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldENTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsKIAkJCX0KIAkJKQogCSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMLnRva2VucyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMLnRva2VucwppbmRleCA5ZDUyMDRhLi4xYjk5ZDJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTC50b2tlbnMKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0wudG9rZW5zCkBAIC0zOSwxMSArMzksMTIgQEAKICc/Lic9NzYKICc/Oic9NjQKICdAJz0zNgotJ0JhY2t3YXJkJz0xMTAKLSdDc3MnPTEwOAotJ0Zvcm0yJz0xMDYKLSdGb3JtMyc9MTA3Ci0nRm9yd2FyZCc9MTA5CisnQmFja3dhcmQnPTExMQorJ0Nzcyc9MTA5CisnRm9ybSc9MTA2CisnRm9ybTInPTEwNworJ0Zvcm0zJz0xMDgKKydGb3J3YXJkJz0xMTAKICdHcmlkJz0xMDUKICdIb3Jpem9udGFsJz0xMDMKICdWZXJ0aWNhbCc9MTA0CkBAIC0xMTYsNiArMTE3LDcgQEAKIFRfXzEwOD0xMDgKIFRfXzEwOT0xMDkKIFRfXzExMD0xMTAKK1RfXzExMT0xMTEKIFRfXzEzPTEzCiBUX18xND0xNAogVF9fMTU9MTUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMTGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMTGV4ZXIuamF2YQppbmRleCA4Y2IyMjMwLi5jOTU4MDA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTExleGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0xMZXhlci5qYXZhCkBAIC0xLDMgKzEsMTggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5wYXJzZXIuYW50bHIuaW50ZXJuYWw7CiAKIC8vIEhhY2s6IFVzZSBvdXIgb3duIExleGVyIHN1cGVyY2xhc3MgYnkgbWVhbnMgb2YgaW1wb3J0LiAKQEAgLTEwMSw2ICsxMTYsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMT0xMTE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEwPTExMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKQEAgLTIwNjgsMTAgKzIwODQsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNjsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ6ODogKCAnRm9ybTInICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ6MTA6ICdGb3JtMicKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDQ6ODogKCAnRm9ybScgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNDoxMDogJ0Zvcm0nCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiRm9ybTIiKTsgCisgICAgICAgICAgICBtYXRjaCgiRm9ybSIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMDg5LDEwICsyMTA1LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1Ojg6ICggJ0Zvcm0zJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1OjEwOiAnRm9ybTMnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1Ojg6ICggJ0Zvcm0yJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA1OjEwOiAnRm9ybTInCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiRm9ybTMiKTsgCisgICAgICAgICAgICBtYXRjaCgiRm9ybTIiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjExMCwxMCArMjEyNiwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA4OwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNjo4OiAoICdDc3MnICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDY6MTA6ICdDc3MnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2Ojg6ICggJ0Zvcm0zJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA2OjEwOiAnRm9ybTMnCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaCgiQ3NzIik7IAorICAgICAgICAgICAgbWF0Y2goIkZvcm0zIik7IAogCiAKICAgICAgICAgICAgIH0KQEAgLTIxMzEsMTAgKzIxNDcsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwOTsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDc6ODogKCAnRm9yd2FyZCcgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzoxMDogJ0ZvcndhcmQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA3Ojg6ICggJ0NzcycgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjEwNzoxMDogJ0NzcycKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoKCJGb3J3YXJkIik7IAorICAgICAgICAgICAgbWF0Y2goIkNzcyIpOyAKIAogCiAgICAgICAgICAgICB9CkBAIC0yMTUyLDEwICsyMTY4LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTA7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4Ojg6ICggJ0JhY2t3YXJkJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4OjEwOiAnQmFja3dhcmQnCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTA4Ojg6ICggJ0ZvcndhcmQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDg6MTA6ICdGb3J3YXJkJwogICAgICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2goIkJhY2t3YXJkIik7IAorICAgICAgICAgICAgbWF0Y2goIkZvcndhcmQiKTsgCiAKIAogICAgICAgICAgICAgfQpAQCAtMjE2OCwxNSArMjE4NCwzNiBAQAogICAgIH0KICAgICAvLyAkQU5UTFIgZW5kICJUX18xMTAiCiAKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTExKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk6ODogKCAnQmFja3dhcmQnICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxMDk6MTA6ICdCYWNrd2FyZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJCYWNrd2FyZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTEiCisKICAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSEVYIgogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0hFWCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0hFWDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjkyOjEwOiAoICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5MjoxMjogKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MTI6ICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTI6MTI6ICggJzB4JyB8ICcwWCcgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MTI6ICggJzB4JyB8ICcwWCcgKQogICAgICAgICAgICAgaW50IGFsdDE9MjsKICAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yMjA0LDcgKzIyNDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTI6MTM6ICcweCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MTM6ICcweCcKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMHgiKTsgCiAKQEAgLTIyMTIsNyArMjI0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTI6MTg6ICcwWCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MTg6ICcwWCcKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMFgiKTsgCiAKQEAgLTIyMjIsNyArMjI1OSw3IEBACiAKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTI6MjQ6ICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKICAgICAgICAgICAgIGludCBjbnQyPTA7CiAgICAgICAgICAgICBsb29wMjoKICAgICAgICAgICAgIGRvIHsKQEAgLTIyNjAsNyArMjI5Nyw3IEBACiAgICAgICAgICAgICAgICAgY250MisrOwogICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjkyOjU4OiAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CiAgICAgICAgICAgICBpbnQgYWx0ND0yOwogICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTIyNjksMTAgKzIzMDYsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjkyOjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NTk6ICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCcjJyk7IAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5Mjo2MzogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NjM6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yMjkwLDcgKzIzMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5Mjo2NDogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NjQ6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTIzMTQsNyArMjM1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5Mjo4NDogKCAnbCcgfCAnTCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAwOjg0OiAoICdsJyB8ICdMJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMjM1MywxMSArMjM5MCwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9JTlQ7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5NDoxMDogKCAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5NDoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAyOjEwOiAoICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAyOjEyOiAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKgogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2hSYW5nZSgnMCcsJzknKTsgCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5NDoyMTogKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMjoyMTogKCAnMCcgLi4gJzknIHwgJ18nICkqCiAgICAgICAgICAgICBsb29wNToKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQgYWx0NT0yOwpAQCAtMjQwNiwxMSArMjQ0MywxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9ERUNJTUFMOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTY6MTQ6ICggUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5NjoxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6MTQ6ICggUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNDoxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTY6MjU6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6MjU6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPwogICAgICAgICAgICAgaW50IGFsdDc9MjsKICAgICAgICAgICAgIGludCBMQTdfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNDE5LDcgKzI0NTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTY6MjY6ICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6MjY6ICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRSd8fGlucHV0LkxBKDEpPT0nZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0yNDMwLDcgKzI0NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5NjozNjogKCAnKycgfCAnLScgKT8KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6MzY6ICggJysnIHwgJy0nICk/CiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2PTI7CiAgICAgICAgICAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNDYzLDcgKzI1MDAsNyBAQAogCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njk2OjU4OiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA0OjU4OiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KICAgICAgICAgICAgIGludCBhbHQ4PTM7CiAgICAgICAgICAgICBpbnQgTEE4XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMjQ3NSw3ICsyNTEyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njk2OjU5OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKQEAgLTI0OTksNyArMjUzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTY6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nRid8fGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0yNTMyLDEwICsyNTY5LDEwIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lEOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTg6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTg6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDY6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDY6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTg6MTE6ICggJ14nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNjoxMTogKCAnXicgKT8KICAgICAgICAgICAgIGludCBhbHQ5PTI7CiAgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKIApAQCAtMjU0NCw3ICsyNTgxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njk4OjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDY6MTE6ICdeJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdeJyk7IAogCkBAIC0yNTYyLDcgKzI1OTksNyBAQAogICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5ODo0NDogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA2OjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgogICAgICAgICAgICAgbG9vcDEwOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBhbHQxMD0yOwpAQCAtMjYxMSwxMCArMjY0OCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TVFJJTkc7CiAgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAwOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwODoxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA4OjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKICAgICAgICAgICAgIGludCBhbHQxNT0yOwogICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNjMyLDEwICsyNjY5LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MTY6ICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwODoxNjogJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/CiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wiJyk7IAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoyMDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA4OjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKICAgICAgICAgICAgICAgICAgICAgbG9vcDExOgogICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTE9MzsKQEAgLTI2NTEsNyArMjY4OCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6MjE6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6MjE6ICdcXFxcJyAuCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKICAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKQEAgLTI2NTksNyArMjY5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDoyODogfiAoICggJ1xcXFwnIHwgJ1wiJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwODoyODogfiAoICggJ1xcXFwnIHwgJ1wiJyApICkKICAgICAgICAgICAgICAgICAgICAgCSAgICB7CiAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nIScpfHwoaW5wdXQuTEEoMSk+PScjJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMjY3OSw3ICsyNzE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NDQ6ICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwODo0NDogKCAnXCInICk/CiAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMj0yOwogICAgICAgICAgICAgICAgICAgICBpbnQgTEExMl8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTI2ODgsNyArMjcyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDo0NDogJ1wiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA4OjQ0OiAnXCInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKIApAQCAtMjcwMSwxMCArMjczOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAwOjQ5OiAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6NDk6ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKICAgICAgICAgICAgICAgICAgICAgbG9vcDEzOgogICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTM9MzsKQEAgLTI3MjAsNyArMjc1Nyw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMpIHsKICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6NTU6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6NTU6ICdcXFxcJyAuCiAgICAgICAgICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKICAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKQEAgLTI3MjgsNyArMjc2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIAkgICAgfQogICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKLSAgICAgICAgICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDo2MjogfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6NjI6IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKQogICAgICAgICAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PScmJyl8fChpbnB1dC5MQSgxKT49JygnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgewogICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CkBAIC0yNzQ4LDcgKzI3ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMDo3OTogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwODo3OTogKCAnXFwnJyApPwogICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQ9MjsKICAgICAgICAgICAgICAgICAgICAgaW50IExBMTRfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yNzU3LDcgKzI3OTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDA6Nzk6ICdcXCcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6Nzk6ICdcXCcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKIApAQCAtMjc4OCwxMiArMjgyNSwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9NTF9DT01NRU5UOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDI6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMjoxOTogJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTA6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMDoxOTogJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goIi8qIik7IAogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwMjoyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMDoyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCiAgICAgICAgICAgICBsb29wMTY6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CkBAIC0yODE4LDcgKzI4NTUsNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzAyOjUyOiAuCisgICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzEwOjUyOiAuCiAgICAgICAgICAgICAJICAgIHsKICAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCiAKQEAgLTI4NDgsMTIgKzI4ODUsMTIgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU0xfQ09NTUVOVDsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA0OjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNDoxOTogJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMjoxNzogKCAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8gKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTI6MTk6ICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPwogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2goIi8vIik7IAogCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNDoyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMjoyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCiAgICAgICAgICAgICBsb29wMTc6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50IGFsdDE3PTI7CkBAIC0yODY2LDcgKzI5MDMsNyBAQAogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgewogICAgICAgICAgICAgCWNhc2UgMSA6Ci0gICAgICAgICAgICAJICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA0OjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQorICAgICAgICAgICAgCSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMjoyNDogfiAoICggJ1xcbicgfCAnXFxyJyApICkKICAgICAgICAgICAgIAkgICAgewogICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSdcdCcpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEInICYmIGlucHV0LkxBKDEpPD0nXGYnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBFJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgewogICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOwpAQCAtMjg4Niw3ICsyOTIzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTI6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPwogICAgICAgICAgICAgaW50IGFsdDE5PTI7CiAgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CiAKQEAgLTI4OTUsOSArMjkzMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6NDE6ICggJ1xccicgKT8gJ1xcbicKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTI6NDE6ICggJ1xccicgKT8gJ1xcbicKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwNDo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxMjo0MTogKCAnXFxyJyApPwogICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg9MjsKICAgICAgICAgICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOwogCkBAIC0yOTA2LDcgKzI5NDMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDQ6NDE6ICdcXHInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTI6NDE6ICdcXHInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKIApAQCAtMjkzOCwxMCArMjk3NSwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKICAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzA2Ojk6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDY6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxNDo5OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NzE0OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKwogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDY6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxNDoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKICAgICAgICAgICAgIGludCBjbnQyMD0wOwogICAgICAgICAgICAgbG9vcDIwOgogICAgICAgICAgICAgZG8gewpAQCAtMjk5NSw4ICszMDMyLDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfQU5ZX09USEVSOwogICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MDg6MTY6ICggLiApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcwODoxODogLgorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc3MTY6MTY6ICggLiApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzcxNjoxODogLgogICAgICAgICAgICAgewogICAgICAgICAgICAgbWF0Y2hBbnkoKTsgCiAKQEAgLTMwMTEsOCArMzA0OCw4IEBACiAgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9BTllfT1RIRVIiCiAKICAgICBwdWJsaWMgdm9pZCBtVG9rZW5zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6ODogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICkKLSAgICAgICAgaW50IGFsdDIxPTEwNzsKKyAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6ODogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBUX18xMTEgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICkKKyAgICAgICAgaW50IGFsdDIxPTEwODsKICAgICAgICAgYWx0MjEgPSBkZmEyMS5wcmVkaWN0KGlucHV0KTsKICAgICAgICAgc3dpdGNoIChhbHQyMSkgewogICAgICAgICAgICAgY2FzZSAxIDoKQEAgLTM3MDIsNjMgKzM3MzksNzAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDk5IDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2MDk6IFJVTEVfSEVYCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjA5OiBUX18xMTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAwIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2MTY6IFJVTEVfSEVYCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1SVUxFX0hFWCgpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAwIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2MTg6IFJVTEVfSU5UCisgICAgICAgICAgICBjYXNlIDEwMSA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjI1OiBSVUxFX0lOVAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwMSA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjI3OiBSVUxFX0RFQ0lNQUwKKyAgICAgICAgICAgIGNhc2UgMTAyIDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2MzQ6IFJVTEVfREVDSU1BTAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDIgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjY0MDogUlVMRV9JRAorICAgICAgICAgICAgY2FzZSAxMDMgOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjY0NzogUlVMRV9JRAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9JRCgpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAzIDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2NDg6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICBjYXNlIDEwNCA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjU1OiBSVUxFX1NUUklORwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9TVFJJTkcoKTsgCiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwNCA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjYwOiBSVUxFX01MX0NPTU1FTlQKKyAgICAgICAgICAgIGNhc2UgMTA1IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2Njc6IFJVTEVfTUxfQ09NTUVOVAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDUgOgotICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjY3NjogUlVMRV9TTF9DT01NRU5UCisgICAgICAgICAgICBjYXNlIDEwNiA6CisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NjgzOiBSVUxFX1NMX0NPTU1FTlQKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTA2IDoKLSAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2OTI6IFJVTEVfV1MKKyAgICAgICAgICAgIGNhc2UgMTA3IDoKKyAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6MTo2OTk6IFJVTEVfV1MKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfV1MoKTsgCiAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwNyA6Ci0gICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjE6NzAwOiBSVUxFX0FOWV9PVEhFUgorICAgICAgICAgICAgY2FzZSAxMDggOgorICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzoxOjcwNzogUlVMRV9BTllfT1RIRVIKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbVJVTEVfQU5ZX09USEVSKCk7IAogCkBAIC0zNzcyLDE3ICszODE2LDE3IEBACiAKICAgICBwcm90ZWN0ZWQgREZBMjEgZGZhMjEgPSBuZXcgREZBMjEodGhpcyk7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb3RTID0KLSAgICAgICAgIlwxXHVmZmZmXDFcNzBcMlx1ZmZmZlwxMVw3MFwxXDEyM1wxXDcwXDVcdWZmZmZcMVwxMzZcM1x1ZmZmZlwxXDE0NFwxXDE1MFwxXDE1NFwxXDE1NlwxXDE2MFwxXDE2MlwxXDE2NFwxXDE2NlwxXDE3MFwxXDE3MlwxXDE3NVwxXDcwXDFcdTAwODBcMTJcNzBcMlx1MDA4ZFwxXDY2XDVcdWZmZmZcMVw3MFwzXHVmZmZmXDIyXDcwXDFcdTAwYTdcMlw3MFwxXHUwMGFhXDNcdWZmZmZcMVx1MDBhYlwyXDcwXDVcdWZmZmZcMVx1MDBhZlwzMlx1ZmZmZlwxXHUwMGIxXDFcdWZmZmZcMVx1MDBiM1w0XHVmZmZmXDFcdTAwYjRcMlx1ZmZmZlwxMlw3MFwxXHVmZmZmXDFcdTAwOGRcNFx1ZmZmZlwxMFw3MFwxXHUwMGM5XDRcNzBcMVx1MDBjZVwxMFw3MFwxXHVmZmZmXDJcNzBcMlx1ZmZmZlwxXHUwMGRhXDFcNzBcN1x1ZmZmZlwzXDcwXDFcdTAwZGZcMVx1MDBlMFw1XDcwXDFcdTAwZTdcMTBcNzBcMVx1MDBmMFwxXHVmZmZmXDRcNzBcMVx1ZmZmZlw0XDcwXDFcdTAwZjlcNlw3MFwxXHVmZmZmXDFcdTAxMDBcMVx1MDEwMVwyXDcwXDJcdWZmZmZcM1w3MFwxXHUwMTA3XDJcNzBcMVx1ZmZmZlw1XDcwXDFcdTAxMTBcMlw3MFwxXHVmZmZmXDFcNzBcMVx1MDExNFwyXDcwXDFcdTAxMThcM1w3MFwxXHVmZmZmXDZcNzBcMlx1ZmZmZlwxXHUwMTIzXDFcdTAxMjRcM1w3MFwxXHVmZmZmXDFcdTAxMjhcMVx1MDEyOVw0XDcwXDFcdTAxMmVcMVx1MDEyZlwxXHVmZmZmXDJcNzBcMVx1MDEzMlwxXHVmZmZmXDJcNzBcMlx1ZmZmZlwxMFw3MFwxXHUwMTNlXDFcNzBcMlx1ZmZmZlwxXHUwMTQwXDJcNzBcMlx1ZmZmZlwyXDcwXDFcdTAxNDVcMVw3MFwyXHVmZmZmXDFcNzBcMVx1MDE0OFwxXHVmZmZmXDFcNzBcMVx1ZmZmZlwxXDcwXDFcdTAxNGJcMlw3MFwxXHUwMTRlXDNcNzBcMVx1MDE1NFwxXHVmZmZmXDFcNzBcMVx1ZmZmZlwyXDcwXDFcdTAxNThcMVw3MFwxXHVmZmZmXDFcdTAxNWFcMVw3MFwxXHVmZmZmXDJcNzBcMVx1ZmZmZlwyXDcwXDFcdWZmZmZcMVw3MFwxXHVmZmZmXDNcNzBcMVx1ZmZmZlwyXDcwXDFcdTAxNjdcMVx1ZmZmZlwxXHUwMTY4XDFcdWZmZmZcNVw3MFwxXHUwMTZlXDZcNzBcMlx1ZmZmZlw1XDcwXDFcdWZmZmZcNFw3MFwxXHUwMTdlXDFcdTAxN2ZcMTFcNzBcMlx1ZmZmZlwxXHUwMTg5XDVcNzBcMVx1MDE4ZlwyXDcwXDFcdWZmZmZcNVw3MFwxXHVmZmZmXDIxXDcwXDFcdTAxYThcMVx1MDFhOVwzXDcwXDFcdWZmZmZcMVx1MDFhZFwzXHVmZmZmXDFcNzBcMlx1ZmZmZlwxXDcwXDFcdTAxYjBcMVx1ZmZmZiI7CisgICAgICAgICJcMVx1ZmZmZlwxXDcwXDJcdWZmZmZcMTFcNzBcMVwxMjNcMVw3MFw1XHVmZmZmXDFcMTM2XDNcdWZmZmZcMVwxNDRcMVwxNTBcMVwxNTRcMVwxNTZcMVwxNjBcMVwxNjJcMVwxNjRcMVwxNjZcMVwxNzBcMVwxNzJcMVwxNzVcMVw3MFwxXHUwMDgwXDEyXDcwXDJcdTAwOGRcMVw2Nlw1XHVmZmZmXDFcNzBcM1x1ZmZmZlwyMlw3MFwxXHUwMGE3XDJcNzBcMVx1MDBhYVwzXHVmZmZmXDFcdTAwYWJcMlw3MFw1XHVmZmZmXDFcdTAwYWZcMzJcdWZmZmZcMVx1MDBiMVwxXHVmZmZmXDFcdTAwYjNcNFx1ZmZmZlwxXHUwMGI0XDJcdWZmZmZcMTJcNzBcMVx1ZmZmZlwxXHUwMDhkXDRcdWZmZmZcMTBcNzBcMVx1MDBjOVw0XDcwXDFcdTAwY2VcMTBcNzBcMVx1ZmZmZlwyXDcwXDJcdWZmZmZcMVx1MDBkYVwxXDcwXDdcdWZmZmZcM1w3MFwxXHUwMGRmXDFcdTAwZTBcNVw3MFwxXHUwMGU3XDEwXDcwXDFcdTAwZjBcMVx1ZmZmZlw0XDcwXDFcdWZmZmZcNFw3MFwxXHUwMGY5XDZcNzBcMVx1ZmZmZlwxXHUwMTAwXDFcdTAxMDFcMlw3MFwyXHVmZmZmXDNcNzBcMVx1MDEwN1wxXHUwMTBhXDFcNzBcMVx1ZmZmZlw1XDcwXDFcdTAxMTFcMlw3MFwxXHVmZmZmXDFcNzBcMVx1MDExNVwyXDcwXDFcdTAxMTlcM1w3MFwxXHVmZmZmXDZcNzBcMlx1ZmZmZlwxXHUwMTI0XDFcdTAxMjVcM1w3MFwxXHVmZmZmXDFcdTAxMjlcMVx1MDEyYVwxXHVmZmZmXDRcNzBcMVx1MDEyZlwxXHUwMTMwXDFcdWZmZmZcMlw3MFwxXHUwMTMzXDFcdWZmZmZcMlw3MFwyXHVmZmZmXDEwXDcwXDFcdTAxM2ZcMVw3MFwyXHVmZmZmXDFcdTAxNDFcMlw3MFwyXHVmZmZmXDJcNzBcMVx1MDE0NlwxXDcwXDJcdWZmZmZcMVw3MFwxXHUwMTQ5XDFcdWZmZmZcMVw3MFwxXHVmZmZmXDFcNzBcMVx1MDE0Y1wyXDcwXDFcdTAxNGZcM1w3MFwxXHUwMTU1XDFcdWZmZmZcMVw3MFwxXHVmZmZmXDJcNzBcMVx1MDE1OVwxXDcwXDFcdWZmZmZcMVx1MDE1YlwxXDcwXDFcdWZmZmZcMlw3MFwxXHVmZmZmXDJcNzBcMVx1ZmZmZlwxXDcwXDFcdWZmZmZcM1w3MFwxXHVmZmZmXDJcNzBcMVx1MDE2OFwxXHVmZmZmXDFcdTAxNjlcMVx1ZmZmZlw1XDcwXDFcdTAxNmZcNlw3MFwyXHVmZmZmXDVcNzBcMVx1ZmZmZlw0XDcwXDFcdTAxN2ZcMVx1MDE4MFwxMVw3MFwyXHVmZmZmXDFcdTAxOGFcNVw3MFwxXHUwMTkwXDJcNzBcMVx1ZmZmZlw1XDcwXDFcdWZmZmZcMjFcNzBcMVx1MDFhOVwxXHUwMWFhXDNcNzBcMVx1ZmZmZlwxXHUwMWFlXDNcdWZmZmZcMVw3MFwyXHVmZmZmXDFcNzBcMVx1MDFiMVwxXHVmZmZmIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvZlMgPQotICAgICAgICAiXHUwMWIxXHVmZmZmIjsKKyAgICAgICAgIlx1MDFiMlx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9taW5TID0KLSAgICAgICAgIlwxXDBcMVwxNDFcMlx1ZmZmZlwxXDE2NFwzXDE0MVwxXDE0M1wxXDE0NVwxXDE1N1wxXDE0NVwxXDE0NlwxXDUyXDFcMTQ1XDVcdWZmZmZcMVw3NVwzXHVmZmZmXDFcNTNcMVw1NVwxXDUyXDFcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwyXDU2XDFcMTYzXDFcNzJcMVwxNDFcMVwxNTBcMVwxNDFcMVwxNDVcMVwxNTdcMVwxNDVcMVwxNjJcMVwxNTdcMVwxNjNcMVwxNDFcMlw2MFwxXDQ0XDVcdWZmZmZcMVwxNDNcM1x1ZmZmZlwxXDE0MVwxXDE1MVwxXDE2MFwxXDE1NlwxXDE2MlwxXDE2NVwxXDE2MFwxXDE2MlwxXDE3MVwxXDE0M1wxXDE1NFwxXDE1NlwxXDE2NlwxXDE2NFwxXDE2M1wxXDE3MVwxXDE0NFwxXDE0NlwxXDQ0XDFcMTYwXDFcMTYzXDFcNDRcM1x1ZmZmZlwxXDQ0XDFcMTY3XDFcMTU0XDVcdWZmZmZcMVw3NVwzMlx1ZmZmZlwxXDc1XDFcdWZmZmZcMVw3NFw0XHVmZmZmXDFcNDRcMlx1ZmZmZlwxXDE2M1wxXDE1MVwxXDE1NFwxXDE2NFwyXDE2MlwxXDE1MVwxXDE2MlwxXDE2M1wxXDE0M1wxXHVmZmZmXDFcNjBcNFx1ZmZmZlwxXDE1M1wxXDE0MVwyXDE2NFwxXDE0NVwxXDE0M1wxXDE0N1wxXDE0NVwxXDQ0XDFcMTQ1XDJcMTU3XDFcMTY1XDFcNDRcMVwxNjNcMVwxNDFcMVwxNTFcMlwxNDVcMVwxMDNcMVwxNTFcMVwxNDFcMVx1ZmZmZlwxXDE1N1wxXDE2NFwyXHVmZmZmXDFcNDRcMVwxNTRcN1x1ZmZmZlwxXDE0NVwxXDE0M1wxXDE1NFwyXDQ0XDFcMTY1XDFcMTUxXDFcMTY0XDFcMTQ0XDFcMTU1XDFcNDRcMVwxNTNcMVwxNDFcMVwxNjRcMVwxNTFcMVwxNDNcMVwxNjJcMVwxNTBcMVwxNDVcMVw0NFwxXHVmZmZmXDFcMTU3XDFcMTY3XDFcMTY1XDFcMTYzXDFcdWZmZmZcMVwxNDVcMVwxNTRcMVwxNDVcMVwxNTZcMVw0NFwxXDE2NFwxXDE1N1wxXDE0NlwxXDE2NVwxXDE2MlwxXDE0MVwxXHVmZmZmXDJcNDRcMVwxNTBcMVwxNDVcMlx1ZmZmZlwxXDE2MlwxXDE3MlwxXDE1MVwxXDQ0XDFcNjJcMVwxNDFcMVx1ZmZmZlwxXDE2N1wxXDE0N1wxXDE0NVwxXDE0M1wxXDE1MFwxXDQ0XDFcMTYyXDFcMTY0XDFcdWZmZmZcMVwxNDZcMVw0NFwxXDE2NFwxXDc1XDFcNDRcMVwxNTRcMVwxNjdcMVwxNDRcMVx1ZmZmZlwxXDE2MlwxXDE0NFwxXDE1MVwxXDE1NFwxXDE2NFwxXDE1NlwyXHVmZmZmXDJcNDRcMVwxNTZcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDQ0XDFcMTYyXDFcMTQxXDFcMTQ1XDFcMTQ3XDJcNDRcMVx1ZmZmZlwxXDE1N1wxXDE2M1wxXDQ0XDFcdWZmZmZcMVw3NVwxXDE1NlwyXHVmZmZmXDFcMTcxXDFcMTA2XDFcMTUxXDFcMTYzXDFcMTU3XDJcMTQ1XDFcMTY0XDFcNDRcMVwxNDNcMlx1ZmZmZlwxXDQ0XDFcMTU2XDFcMTQxXDJcdWZmZmZcMVwxNDRcMVwxNjJcMVw0NFwxXDE3MVwyXHVmZmZmXDFcMTU2XDFcNDRcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcMTQ3XDFcNDRcMlwxNTdcMVw0NFwxXDE1M1wxXDc1XDFcMTYyXDFcNDRcMVx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTY0XDFcMTU0XDFcNDRcMVwxNDRcMVx1ZmZmZlwxXDQ0XDFcMTUxXDFcdWZmZmZcMVwxNDdcMVwxMDVcMVx1ZmZmZlwxXDE0M1wxXDE1NlwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxMTNcMVwxNDFcMVwxNTdcMVx1ZmZmZlwxXDE1N1wxXDE0MVwxXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTcyXDFcMTIzXDFcMTY0XDFcMTU2XDFcMTY1XDFcNDRcMVwxMDRcMVwxNDVcMVwxNzFcMVwxNDNcMVwxNDZcMVwxNTRcMlx1ZmZmZlwxXDE0NVwxXDE2NFwxXDE2MlwxXDE1MFwxXDE2M1wxXHVmZmZmXDFcMTQ1XDFcMTcxXDFcMTU3XDFcMTY1XDJcNDRcMVwxNDRcMVwxNjJcMlwxNDFcMVwxNTFcMVwxNDZcMVwxNjNcMVwxNjVcMVwxNjNcMlx1ZmZmZlwxXDQ0XDFcMTQxXDFcMTY0XDJcMTU2XDFcMTUxXDFcNDRcMVwxNjRcMVwxNTFcMVx1ZmZmZlwxXDE2NFwxXDE0NVwxXDE0M1wxXDE0N1wxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTU2XDFcMTQ1XDFcMTQ3XDFcMTQ1XDFcMTExXDFcMTUxXDFcMTU2XDJcMTQ3XDFcMTcxXDFcMTYyXDFcMTQ0XDFcMTY0XDFcMTQ3XDFcNzVcMVwxNzFcMlw0NFwxXDc1XDFcMTUxXDFcNzVcMVx1ZmZmZlwxXDQ0XDNcdWZmZmZcMVwxNTdcMlx1ZmZmZlwxXDE1NlwxXDQ0XDFcdWZmZmYiOworICAgICAgICAiXDFcMFwxXDE0MVwyXHVmZmZmXDFcMTY0XDNcMTQxXDFcMTQzXDFcMTQ1XDFcMTU3XDFcMTQ1XDFcMTQ2XDFcNTJcMVwxNDVcNVx1ZmZmZlwxXDc1XDNcdWZmZmZcMVw1M1wxXDU1XDFcNTJcMVw3NVwxXDc2XDFcNzVcMVwxNzRcMVw0NlwxXDc1XDJcNTZcMVwxNjNcMVw3MlwxXDE0MVwxXDE1MFwxXDE0MVwxXDE0NVwxXDE1N1wxXDE0NVwxXDE2MlwxXDE1N1wxXDE2M1wxXDE0MVwyXDYwXDFcNDRcNVx1ZmZmZlwxXDE0M1wzXHVmZmZmXDFcMTQxXDFcMTUxXDFcMTYwXDFcMTU2XDFcMTYyXDFcMTY1XDFcMTYwXDFcMTYyXDFcMTcxXDFcMTQzXDFcMTU0XDFcMTU2XDFcMTY2XDFcMTY0XDFcMTYzXDFcMTcxXDFcMTQ0XDFcMTQ2XDFcNDRcMVwxNjBcMVwxNjNcMVw0NFwzXHVmZmZmXDFcNDRcMVwxNjdcMVwxNTRcNVx1ZmZmZlwxXDc1XDMyXHVmZmZmXDFcNzVcMVx1ZmZmZlwxXDc0XDRcdWZmZmZcMVw0NFwyXHVmZmZmXDFcMTYzXDFcMTUxXDFcMTU0XDFcMTY0XDJcMTYyXDFcMTUxXDFcMTYyXDFcMTYzXDFcMTQzXDFcdWZmZmZcMVw2MFw0XHVmZmZmXDFcMTUzXDFcMTQxXDJcMTY0XDFcMTQ1XDFcMTQzXDFcMTQ3XDFcMTQ1XDFcNDRcMVwxNDVcMlwxNTdcMVwxNjVcMVw0NFwxXDE2M1wxXDE0MVwxXDE1MVwyXDE0NVwxXDEwM1wxXDE1MVwxXDE0MVwxXHVmZmZmXDFcMTU3XDFcMTY0XDJcdWZmZmZcMVw0NFwxXDE1NFw3XHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTU0XDJcNDRcMVwxNjVcMVwxNTFcMVwxNjRcMVwxNDRcMVwxNTVcMVw0NFwxXDE1M1wxXDE0MVwxXDE2NFwxXDE1MVwxXDE0M1wxXDE2MlwxXDE1MFwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNTdcMVwxNjdcMVwxNjVcMVwxNjNcMVx1ZmZmZlwxXDE0NVwxXDE1NFwxXDE0NVwxXDE1NlwxXDQ0XDFcMTY0XDFcMTU3XDFcMTQ2XDFcMTY1XDFcMTYyXDFcMTQxXDFcdWZmZmZcMlw0NFwxXDE1MFwxXDE0NVwyXHVmZmZmXDFcMTYyXDFcMTcyXDFcMTUxXDJcNDRcMVwxNDFcMVx1ZmZmZlwxXDE2N1wxXDE0N1wxXDE0NVwxXDE0M1wxXDE1MFwxXDQ0XDFcMTYyXDFcMTY0XDFcdWZmZmZcMVwxNDZcMVw0NFwxXDE2NFwxXDc1XDFcNDRcMVwxNTRcMVwxNjdcMVwxNDRcMVx1ZmZmZlwxXDE2MlwxXDE0NFwxXDE1MVwxXDE1NFwxXDE2NFwxXDE1NlwyXHVmZmZmXDJcNDRcMVwxNTZcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDQ0XDFcdWZmZmZcMVwxNjJcMVwxNDFcMVwxNDVcMVwxNDdcMlw0NFwxXHVmZmZmXDFcMTU3XDFcMTYzXDFcNDRcMVx1ZmZmZlwxXDc1XDFcMTU2XDJcdWZmZmZcMVwxNzFcMVwxMDZcMVwxNTFcMVwxNjNcMVwxNTdcMlwxNDVcMVwxNjRcMVw0NFwxXDE0M1wyXHVmZmZmXDFcNDRcMVwxNTZcMVwxNDFcMlx1ZmZmZlwxXDE0NFwxXDE2MlwxXDQ0XDFcMTcxXDJcdWZmZmZcMVwxNTZcMVw0NFwxXHVmZmZmXDFcMTU2XDFcdWZmZmZcMVwxNDdcMVw0NFwyXDE1N1wxXDQ0XDFcMTUzXDFcNzVcMVwxNjJcMVw0NFwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNjRcMVwxNTRcMVw0NFwxXDE0NFwxXHVmZmZmXDFcNDRcMVwxNTFcMVx1ZmZmZlwxXDE0N1wxXDEwNVwxXHVmZmZmXDFcMTQzXDFcMTU2XDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDExM1wxXDE0MVwxXDE1N1wxXHVmZmZmXDFcMTU3XDFcMTQxXDFcNDRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNzJcMVwxMjNcMVwxNjRcMVwxNTZcMVwxNjVcMVw0NFwxXDEwNFwxXDE0NVwxXDE3MVwxXDE0M1wxXDE0NlwxXDE1NFwyXHVmZmZmXDFcMTQ1XDFcMTY0XDFcMTYyXDFcMTUwXDFcMTYzXDFcdWZmZmZcMVwxNDVcMVwxNzFcMVwxNTdcMVwxNjVcMlw0NFwxXDE0NFwxXDE2MlwyXDE0MVwxXDE1MVwxXDE0NlwxXDE2M1wxXDE2NVwxXDE2M1wyXHVmZmZmXDFcNDRcMVwxNDFcMVwxNjRcMlwxNTZcMVwxNTFcMVw0NFwxXDE2NFwxXDE1MVwxXHVmZmZmXDFcMTY0XDFcMTQ1XDFcMTQzXDFcMTQ3XDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNTZcMVwxNDVcMVwxNDdcMVwxNDVcMVwxMTFcMVwxNTFcMVwxNTZcMlwxNDdcMVwxNzFcMVwxNjJcMVwxNDRcMVwxNjRcMVwxNDdcMVw3NVwxXDE3MVwyXDQ0XDFcNzVcMVwxNTFcMVw3NVwxXHVmZmZmXDFcNDRcM1x1ZmZmZlwxXDE1N1wyXHVmZmZmXDFcMTU2XDFcNDRcMVx1ZmZmZiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9tYXhTID0KLSAgICAgICAgIlwxXHVmZmZmXDFcMTQxXDJcdWZmZmZcMlwxNzFcMVwxNDFcMVwxNTdcMVwxNzBcMVwxNDVcMlwxNTdcMVwxNTZcMVw3NVwxXDE2NVw1XHVmZmZmXDFcNzZcM1x1ZmZmZlwxXDc1XDFcNzZcMlw3NVwxXDc2XDFcNzVcMVwxNzRcMVw0NlwxXDc1XDFcNTZcMVw3MlwxXDE2M1wxXDcyXDFcMTQxXDFcMTUwXDFcMTQxXDFcMTQ1XDFcMTU3XDFcMTQ1XDFcMTYyXDFcMTU3XDFcMTYzXDFcMTQxXDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmZcMVwxNDNcM1x1ZmZmZlwxXDE2MlwxXDE1MVwxXDE2MFwxXDE1NlwxXDE2MlwxXDE3MVwxXDE2MFwxXDE2MlwxXDE3MVwxXDE2MlwxXDE1NFwxXDE1NlwxXDE2NlwxXDE2NFwxXDE2M1wxXDE3MVwxXDE0NFwxXDE0NlwxXDE3MlwxXDE2MFwxXDE2M1wxXDE3MlwzXHVmZmZmXDFcMTcyXDFcMTY3XDFcMTU0XDVcdWZmZmZcMVw3NVwzMlx1ZmZmZlwxXDc1XDFcdWZmZmZcMVw3NFw0XHVmZmZmXDFcMTcyXDJcdWZmZmZcMVwxNjRcMVwxNTFcMVwxNjJcMVwxNjRcMlwxNjJcMVwxNTFcMVwxNjJcMVwxNjNcMVwxNDNcMVx1ZmZmZlwxXDE1NFw0XHVmZmZmXDFcMTUzXDFcMTQxXDJcMTY0XDFcMTQ1XDFcMTQzXDFcMTQ3XDFcMTQ1XDFcMTcyXDFcMTQ1XDJcMTU3XDFcMTY1XDFcMTcyXDFcMTYzXDFcMTQxXDFcMTUxXDJcMTQ1XDFcMTIzXDFcMTUxXDFcMTQxXDFcdWZmZmZcMVwxNTdcMVwxNjRcMlx1ZmZmZlwxXDE3MlwxXDE1NFw3XHVmZmZmXDFcMTQ1XDFcMTQzXDFcMTU0XDJcMTcyXDFcMTY1XDFcMTUxXDFcMTY0XDFcMTQ0XDFcMTY3XDFcMTcyXDFcMTUzXDFcMTQxXDFcMTY0XDFcMTUxXDFcMTQzXDFcMTYyXDFcMTUwXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNTdcMVwxNjdcMVwxNjVcMVwxNjNcMVx1ZmZmZlwxXDE0NVwxXDE1NFwxXDE0NVwxXDE1NlwxXDE3MlwxXDE2NFwxXDE1N1wxXDE0NlwxXDE2NVwxXDE2MlwxXDE0MVwxXHVmZmZmXDJcMTcyXDFcMTUwXDFcMTQ1XDJcdWZmZmZcMVwxNjJcMVwxNzJcMVwxNTFcMVwxNzJcMVw2M1wxXDE0MVwxXHVmZmZmXDFcMTY3XDFcMTQ3XDFcMTQ1XDFcMTQzXDFcMTUwXDFcMTcyXDFcMTYyXDFcMTY0XDFcdWZmZmZcMVwxNDZcMVwxNzJcMVwxNjRcMVwxNTFcMVwxNzJcMVwxNTRcMVwxNjdcMVwxNjNcMVx1ZmZmZlwxXDE2MlwxXDE0NFwxXDE1MVwxXDE1NFwxXDE2NFwxXDE1NlwyXHVmZmZmXDJcMTcyXDFcMTU2XDFcMTU3XDFcMTQzXDFcdWZmZmZcMlwxNzJcMVwxNjJcMVwxNDFcMVwxNDVcMVwxNDdcMlwxNzJcMVx1ZmZmZlwxXDE1N1wxXDE2M1wxXDE3MlwxXHVmZmZmXDFcMTUxXDFcMTU2XDJcdWZmZmZcMVwxNzFcMVwxMDZcMVwxNTFcMVwxNjNcMVwxNTdcMlwxNDVcMVwxNjRcMVwxNzJcMVwxNDNcMlx1ZmZmZlwxXDE3MlwxXDE1NlwxXDE0MVwyXHVmZmZmXDFcMTQ0XDFcMTYyXDFcMTcyXDFcMTcxXDJcdWZmZmZcMVwxNTZcMVwxNzJcMVx1ZmZmZlwxXDE1NlwxXHVmZmZmXDFcMTQ3XDFcMTcyXDJcMTU3XDFcMTcyXDFcMTUzXDFcNzVcMVwxNjJcMVwxNzJcMVx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTY0XDFcMTU0XDFcMTcyXDFcMTQ0XDFcdWZmZmZcMVwxNzJcMVwxNTFcMVx1ZmZmZlwxXDE0N1wxXDEyM1wxXHVmZmZmXDFcMTQzXDFcMTU2XDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDExM1wxXDE0MVwxXDE1N1wxXHVmZmZmXDFcMTU3XDFcMTQxXDFcMTcyXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDEyM1wxXDE2NFwxXDE1NlwxXDE2NVwxXDE3MlwxXDEwNFwxXDE0NVwxXDE3MVwxXDE0M1wxXDE0NlwxXDE1NFwyXHVmZmZmXDFcMTQ1XDFcMTY0XDFcMTYyXDFcMTUwXDFcMTYzXDFcdWZmZmZcMVwxNDVcMVwxNzFcMVwxNTdcMVwxNjVcMlwxNzJcMVwxNDRcMVwxNjJcMlwxNDFcMVwxNTFcMVwxNDZcMVwxNjNcMVwxNjVcMVwxNjNcMlx1ZmZmZlwxXDE3MlwxXDE0MVwxXDE2NFwyXDE1NlwxXDE1MVwxXDE3MlwxXDE2NFwxXDE1MVwxXHVmZmZmXDFcMTY0XDFcMTQ1XDFcMTQzXDFcMTQ3XDFcMTU2XDFcdWZmZmZcMVwxNTFcMVwxNTZcMVwxNDVcMVwxNDdcMVwxNDVcMVwxMTFcMVwxNTFcMVwxNTZcMlwxNDdcMVwxNzFcMVwxNjJcMVwxNDRcMVwxNjRcMVwxNDdcMVw3NVwxXDE3MVwyXDE3MlwxXDc1XDFcMTUxXDFcNzVcMVx1ZmZmZlwxXDE3MlwzXHVmZmZmXDFcMTU3XDJcdWZmZmZcMVwxNTZcMVwxNzJcMVx1ZmZmZiI7CisgICAgICAgICJcMVx1ZmZmZlwxXDE0MVwyXHVmZmZmXDJcMTcxXDFcMTQxXDFcMTU3XDFcMTcwXDFcMTQ1XDJcMTU3XDFcMTU2XDFcNzVcMVwxNjVcNVx1ZmZmZlwxXDc2XDNcdWZmZmZcMVw3NVwxXDc2XDJcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwxXDU2XDFcNzJcMVwxNjNcMVw3MlwxXDE0MVwxXDE1MFwxXDE0MVwxXDE0NVwxXDE1N1wxXDE0NVwxXDE2MlwxXDE1N1wxXDE2M1wxXDE0MVwxXDE3MFwxXDE1NFwxXDE3Mlw1XHVmZmZmXDFcMTQzXDNcdWZmZmZcMVwxNjJcMVwxNTFcMVwxNjBcMVwxNTZcMVwxNjJcMVwxNzFcMVwxNjBcMVwxNjJcMVwxNzFcMVwxNjJcMVwxNTRcMVwxNTZcMVwxNjZcMVwxNjRcMVwxNjNcMVwxNzFcMVwxNDRcMVwxNDZcMVwxNzJcMVwxNjBcMVwxNjNcMVwxNzJcM1x1ZmZmZlwxXDE3MlwxXDE2N1wxXDE1NFw1XHVmZmZmXDFcNzVcMzJcdWZmZmZcMVw3NVwxXHVmZmZmXDFcNzRcNFx1ZmZmZlwxXDE3MlwyXHVmZmZmXDFcMTY0XDFcMTUxXDFcMTYyXDFcMTY0XDJcMTYyXDFcMTUxXDFcMTYyXDFcMTYzXDFcMTQzXDFcdWZmZmZcMVwxNTRcNFx1ZmZmZlwxXDE1M1wxXDE0MVwyXDE2NFwxXDE0NVwxXDE0M1wxXDE0N1wxXDE0NVwxXDE3MlwxXDE0NVwyXDE1N1wxXDE2NVwxXDE3MlwxXDE2M1wxXDE0MVwxXDE1MVwyXDE0NVwxXDEyM1wxXDE1MVwxXDE0MVwxXHVmZmZmXDFcMTU3XDFcMTY0XDJcdWZmZmZcMVwxNzJcMVwxNTRcN1x1ZmZmZlwxXDE0NVwxXDE0M1wxXDE1NFwyXDE3MlwxXDE2NVwxXDE1MVwxXDE2NFwxXDE0NFwxXDE2N1wxXDE3MlwxXDE1M1wxXDE0MVwxXDE2NFwxXDE1MVwxXDE0M1wxXDE2MlwxXDE1MFwxXDE0NVwxXDE3MlwxXHVmZmZmXDFcMTU3XDFcMTY3XDFcMTY1XDFcMTYzXDFcdWZmZmZcMVwxNDVcMVwxNTRcMVwxNDVcMVwxNTZcMVwxNzJcMVwxNjRcMVwxNTdcMVwxNDZcMVwxNjVcMVwxNjJcMVwxNDFcMVx1ZmZmZlwyXDE3MlwxXDE1MFwxXDE0NVwyXHVmZmZmXDFcMTYyXDFcMTcyXDFcMTUxXDJcMTcyXDFcMTQxXDFcdWZmZmZcMVwxNjdcMVwxNDdcMVwxNDVcMVwxNDNcMVwxNTBcMVwxNzJcMVwxNjJcMVwxNjRcMVx1ZmZmZlwxXDE0NlwxXDE3MlwxXDE2NFwxXDE1MVwxXDE3MlwxXDE1NFwxXDE2N1wxXDE2M1wxXHVmZmZmXDFcMTYyXDFcMTQ0XDFcMTUxXDFcMTU0XDFcMTY0XDFcMTU2XDJcdWZmZmZcMlwxNzJcMVwxNTZcMVwxNTdcMVwxNDNcMVx1ZmZmZlwyXDE3MlwxXHVmZmZmXDFcMTYyXDFcMTQxXDFcMTQ1XDFcMTQ3XDJcMTcyXDFcdWZmZmZcMVwxNTdcMVwxNjNcMVwxNzJcMVx1ZmZmZlwxXDE1MVwxXDE1NlwyXHVmZmZmXDFcMTcxXDFcMTA2XDFcMTUxXDFcMTYzXDFcMTU3XDJcMTQ1XDFcMTY0XDFcMTcyXDFcMTQzXDJcdWZmZmZcMVwxNzJcMVwxNTZcMVwxNDFcMlx1ZmZmZlwxXDE0NFwxXDE2MlwxXDE3MlwxXDE3MVwyXHVmZmZmXDFcMTU2XDFcMTcyXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE0N1wxXDE3MlwyXDE1N1wxXDE3MlwxXDE1M1wxXDc1XDFcMTYyXDFcMTcyXDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwxXDE2NFwxXDE1NFwxXDE3MlwxXDE0NFwxXHVmZmZmXDFcMTcyXDFcMTUxXDFcdWZmZmZcMVwxNDdcMVwxMjNcMVx1ZmZmZlwxXDE0M1wxXDE1NlwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxMTNcMVwxNDFcMVwxNTdcMVx1ZmZmZlwxXDE1N1wxXDE0MVwxXDE3MlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNzJcMVwxMjNcMVwxNjRcMVwxNTZcMVwxNjVcMVwxNzJcMVwxMDRcMVwxNDVcMVwxNzFcMVwxNDNcMVwxNDZcMVwxNTRcMlx1ZmZmZlwxXDE0NVwxXDE2NFwxXDE2MlwxXDE1MFwxXDE2M1wxXHVmZmZmXDFcMTQ1XDFcMTcxXDFcMTU3XDFcMTY1XDJcMTcyXDFcMTQ0XDFcMTYyXDJcMTQxXDFcMTUxXDFcMTQ2XDFcMTYzXDFcMTY1XDFcMTYzXDJcdWZmZmZcMVwxNzJcMVwxNDFcMVwxNjRcMlwxNTZcMVwxNTFcMVwxNzJcMVwxNjRcMVwxNTFcMVx1ZmZmZlwxXDE2NFwxXDE0NVwxXDE0M1wxXDE0N1wxXDE1NlwxXHVmZmZmXDFcMTUxXDFcMTU2XDFcMTQ1XDFcMTQ3XDFcMTQ1XDFcMTExXDFcMTUxXDFcMTU2XDJcMTQ3XDFcMTcxXDFcMTYyXDFcMTQ0XDFcMTY0XDFcMTQ3XDFcNzVcMVwxNzFcMlwxNzJcMVw3NVwxXDE1MVwxXDc1XDFcdWZmZmZcMVwxNzJcM1x1ZmZmZlwxXDE1N1wyXHVmZmZmXDFcMTU2XDFcMTcyXDFcdWZmZmYiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfYWNjZXB0UyA9Ci0gICAgICAgICJcMlx1ZmZmZlwxXDJcMVwzXDEzXHVmZmZmXDFcMjdcMVwzMFwxXDMxXDFcMzJcMVwzM1wxXHVmZmZmXDFcMzVcMVwzNlwxXDM3XDMyXHVmZmZmXDFcMTQ2XDJcMTQ3XDFcMTUyXDFcMTUzXDFcdWZmZmZcMVwxNDZcMVwyXDFcM1wyNlx1ZmZmZlwxXDQyXDFcNjdcMVwyNVwzXHVmZmZmXDFcMjdcMVwzMFwxXDMxXDFcMzJcMVwzM1wxXHVmZmZmXDFcNjJcMVwzNFwxXDM1XDFcMzZcMVwzN1wxXDQwXDFcNzRcMVw2NVwxXDQxXDFcNTdcMVw3NVwxXDY2XDFcNDNcMVwxNTBcMVwxNTFcMVw3MFwxXDQ0XDFcNzFcMVw2M1wxXDQ1XDFcNDdcMVw0NlwxXDUwXDFcMTAxXDFcNTFcMVwxMzJcMVx1ZmZmZlwxXDcyXDFcdWZmZmZcMVw3NlwxXDY0XDFcMTAwXDFcMTMxXDFcdWZmZmZcMVw3N1wxXDEwNVwxMlx1ZmZmZlwxXDE0M1wxXHVmZmZmXDFcMTQ0XDFcMTQ1XDFcMTQ3XDFcMTUyXDI2XHVmZmZmXDFcMTExXDJcdWZmZmZcMVwxMDJcMVwyNlwyXHVmZmZmXDFcNTRcMVw1MlwxXDU1XDFcNTNcMVw2MFwxXDYxXDFcNzNcMjRcdWZmZmZcMVwxMjVcNFx1ZmZmZlwxXDEwN1wxM1x1ZmZmZlwxXDExNlw0XHVmZmZmXDFcMTEyXDFcMTEzXDZcdWZmZmZcMVwxNDBcMTBcdWZmZmZcMVwxMjBcMTBcdWZmZmZcMVwxMDNcNlx1ZmZmZlwxXDEyMVwxXDEwNlw1XHVmZmZmXDFcMTM1XDEwXHVmZmZmXDFcMTE1XDNcdWZmZmZcMVwxMjNcMlx1ZmZmZlwxXDEyXDFcMTE3XDEyXHVmZmZmXDFcMTMwXDFcMTEwXDNcdWZmZmZcMVwxMzZcMVwxMzdcNFx1ZmZmZlwxXDIzXDFcMTA0XDJcdWZmZmZcMVwxMjJcMVx1ZmZmZlwxXDdcMTFcdWZmZmZcMVwyMlwxXHVmZmZmXDFcMTI0XDRcdWZmZmZcMVwxXDJcdWZmZmZcMVw1XDJcdWZmZmZcMVwxMjZcMlx1ZmZmZlwxXDExNFwxXHVmZmZmXDFcMTRcM1x1ZmZmZlwxXDE3XDNcdWZmZmZcMVwxNDFcMVx1ZmZmZlwxXDRcMTRcdWZmZmZcMVwxMzRcMVwxNDJcNVx1ZmZmZlwxXDI0XDE3XHVmZmZmXDFcNTZcMVwxMzNcMTFcdWZmZmZcMVwxMjdcNVx1ZmZmZlwxXDE1XDI2XHVmZmZmXDFcMjFcMVx1ZmZmZlwxXDEwXDFcMTZcMVwxMVwxXHVmZmZmXDFcMjBcMVw2XDJcdWZmZmZcMVwxMyI7CisgICAgICAgICJcMlx1ZmZmZlwxXDJcMVwzXDEzXHVmZmZmXDFcMjdcMVwzMFwxXDMxXDFcMzJcMVwzM1wxXHVmZmZmXDFcMzVcMVwzNlwxXDM3XDMyXHVmZmZmXDFcMTQ3XDJcMTUwXDFcMTUzXDFcMTU0XDFcdWZmZmZcMVwxNDdcMVwyXDFcM1wyNlx1ZmZmZlwxXDQyXDFcNjdcMVwyNVwzXHVmZmZmXDFcMjdcMVwzMFwxXDMxXDFcMzJcMVwzM1wxXHVmZmZmXDFcNjJcMVwzNFwxXDM1XDFcMzZcMVwzN1wxXDQwXDFcNzRcMVw2NVwxXDQxXDFcNTdcMVw3NVwxXDY2XDFcNDNcMVwxNTFcMVwxNTJcMVw3MFwxXDQ0XDFcNzFcMVw2M1wxXDQ1XDFcNDdcMVw0NlwxXDUwXDFcMTAxXDFcNTFcMVwxMzJcMVx1ZmZmZlwxXDcyXDFcdWZmZmZcMVw3NlwxXDY0XDFcMTAwXDFcMTMxXDFcdWZmZmZcMVw3N1wxXDEwNVwxMlx1ZmZmZlwxXDE0NFwxXHVmZmZmXDFcMTQ1XDFcMTQ2XDFcMTUwXDFcMTUzXDI2XHVmZmZmXDFcMTExXDJcdWZmZmZcMVwxMDJcMVwyNlwyXHVmZmZmXDFcNTRcMVw1MlwxXDU1XDFcNTNcMVw2MFwxXDYxXDFcNzNcMjRcdWZmZmZcMVwxMjVcNFx1ZmZmZlwxXDEwN1wxM1x1ZmZmZlwxXDExNlw0XHVmZmZmXDFcMTEyXDFcMTEzXDZcdWZmZmZcMVwxNDFcMTBcdWZmZmZcMVwxMjBcMTBcdWZmZmZcMVwxMDNcNlx1ZmZmZlwxXDEyMVwxXDEwNlw1XHVmZmZmXDFcMTM1XDJcdWZmZmZcMVwxMzZcNlx1ZmZmZlwxXDExNVwzXHVmZmZmXDFcMTIzXDJcdWZmZmZcMVwxMlwxXDExN1wxMlx1ZmZmZlwxXDEzMFwxXDExMFwzXHVmZmZmXDFcMTM3XDFcMTQwXDRcdWZmZmZcMVwyM1wxXDEwNFwyXHVmZmZmXDFcMTIyXDFcdWZmZmZcMVw3XDExXHVmZmZmXDFcMjJcMVx1ZmZmZlwxXDEyNFw0XHVmZmZmXDFcMVwyXHVmZmZmXDFcNVwyXHVmZmZmXDFcMTI2XDJcdWZmZmZcMVwxMTRcMVx1ZmZmZlwxXDE0XDNcdWZmZmZcMVwxN1wzXHVmZmZmXDFcMTQyXDFcdWZmZmZcMVw0XDE0XHVmZmZmXDFcMTM0XDFcMTQzXDVcdWZmZmZcMVwyNFwxN1x1ZmZmZlwxXDU2XDFcMTMzXDExXHVmZmZmXDFcMTI3XDVcdWZmZmZcMVwxNVwyNlx1ZmZmZlwxXDIxXDFcdWZmZmZcMVwxMFwxXDE2XDFcMTFcMVx1ZmZmZlwxXDIwXDFcNlwyXHVmZmZmXDFcMTMiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfc3BlY2lhbFMgPQotICAgICAgICAiXDFcMFx1MDFiMFx1ZmZmZn0+IjsKKyAgICAgICAgIlwxXDBcdTAxYjFcdWZmZmZ9PiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxX3RyYW5zaXRpb25TID0gewogICAgICAgICAgICAgIlwxMVw2NlwyXDY1XDJcNjZcMVw2NVwyMlw2NlwxXDY1XDFcNDBcMVw2M1wxXDI1XDFcNjJcMVwzM1wxXDM3XDFcNjRcMVwyMVwxXDIzXDFcMTVcMVwzMFwxXDIyXDFcMzFcMVw0MVwxXDMyXDFcNTdcMTFcNjBcMVw0NFwxXDE3XDFcMzRcMVwyNFwxXDM1XDFcNDJcMVwyMFwxXDYyXDFcNTZcMVw1NVwyXDYyXDFcNTRcMVw1M1wxXDUxXDE1XDYyXDFcNTJcNFw2MlwxXDI2XDFcNjZcMVwyN1wxXDYxXDFcNjJcMVw2NlwxXDQzXDFcNjJcMVw0NVwxXDEzXDFcMTBcMVw3XDJcNjJcMVwxNFwxXDYyXDFcMTFcMVw2XDFcMTJcMVwxNlwxXDYyXDFcMVwxXDYyXDFcNTBcMVw0XDFcNVwxXDYyXDFcNDdcMVw0NlwzXDYyXDFcMlwxXDM2XDFcM1x1ZmY4Mlw2NiIsCiAgICAgICAgICAgICAiXDFcNjciLApAQCAtNDAxMyw1OSArNDA1Nyw1OSBAQAogICAgICAgICAgICAgIlwxXHUwMTA1IiwKICAgICAgICAgICAgICJcMVx1MDEwNiIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxMDhcMVx1MDEwOSIsCi0gICAgICAgICAgICAiXDFcdTAxMGEiLAotICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMlw3MFwxXHUwMTA4XDFcdTAxMDlcNlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKICAgICAgICAgICAgICJcMVx1MDEwYiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDEwYyIsCiAgICAgICAgICAgICAiXDFcdTAxMGQiLAogICAgICAgICAgICAgIlwxXHUwMTBlIiwKICAgICAgICAgICAgICJcMVx1MDEwZiIsCisgICAgICAgICAgICAiXDFcdTAxMTAiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTExIiwKICAgICAgICAgICAgICJcMVx1MDExMiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDExMyIsCi0gICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxMTUiLAotICAgICAgICAgICAgIlwxXHUwMTE3XDUzXHVmZmZmXDFcdTAxMTYiLAotICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTE5IiwKLSAgICAgICAgICAgICJcMVx1MDExYSIsCi0gICAgICAgICAgICAiXDFcdTAxMWNcMTZcdWZmZmZcMVx1MDExYiIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDExZCIsCisgICAgICAgICAgICAiXDFcdTAxMTQiLAorICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAorICAgICAgICAgICAgIlwxXHUwMTE2IiwKKyAgICAgICAgICAgICJcMVx1MDExOFw1M1x1ZmZmZlwxXHUwMTE3IiwKKyAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKKyAgICAgICAgICAgICJcMVx1MDExYSIsCisgICAgICAgICAgICAiXDFcdTAxMWIiLAorICAgICAgICAgICAgIlwxXHUwMTFkXDE2XHVmZmZmXDFcdTAxMWMiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxMWUiLAogICAgICAgICAgICAgIlwxXHUwMTFmIiwKICAgICAgICAgICAgICJcMVx1MDEyMCIsCiAgICAgICAgICAgICAiXDFcdTAxMjEiLAogICAgICAgICAgICAgIlwxXHUwMTIyIiwKKyAgICAgICAgICAgICJcMVx1MDEyMyIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTI1IiwKICAgICAgICAgICAgICJcMVx1MDEyNiIsCiAgICAgICAgICAgICAiXDFcdTAxMjciLAorICAgICAgICAgICAgIlwxXHUwMTI4IiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTJhIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTJiIiwKICAgICAgICAgICAgICJcMVx1MDEyYyIsCiAgICAgICAgICAgICAiXDFcdTAxMmQiLAorICAgICAgICAgICAgIlwxXHUwMTJlIiwKICAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKICAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTMwIiwKICAgICAgICAgICAgICJcMVx1MDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxMzIiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxMzRcNTNcdWZmZmZcMVx1MDEzMyIsCi0gICAgICAgICAgICAiXDFcdTAxMzUiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEzNVw1M1x1ZmZmZlwxXHUwMTM0IiwKICAgICAgICAgICAgICJcMVx1MDEzNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTM3IiwKICAgICAgICAgICAgICJcMVx1MDEzOCIsCiAgICAgICAgICAgICAiXDFcdTAxMzkiLApAQCAtNDA3Myw5MSArNDExNyw5MSBAQAogICAgICAgICAgICAgIlwxXHUwMTNiIiwKICAgICAgICAgICAgICJcMVx1MDEzYyIsCiAgICAgICAgICAgICAiXDFcdTAxM2QiLAorICAgICAgICAgICAgIlwxXHUwMTNlIiwKICAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKLSAgICAgICAgICAgICJcMVx1MDEzZiIsCisgICAgICAgICAgICAiXDFcdTAxNDAiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKLSAgICAgICAgICAgICJcMVx1MDE0MSIsCiAgICAgICAgICAgICAiXDFcdTAxNDIiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE0MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTQ0IiwKKyAgICAgICAgICAgICJcMVx1MDE0NSIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxNDYiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE0NyIsCi0gICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCiAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICJcMVx1MDE0OSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE0OCIsCisgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE0YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE0YiIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxNGMiLAogICAgICAgICAgICAgIlwxXHUwMTRkIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZSIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxNGYiLAogICAgICAgICAgICAgIlwxXHUwMTUwIiwKICAgICAgICAgICAgICJcMVx1MDE1MSIsCi0gICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlw1XDcwXDFcdTAxNTNcNVw3MFwxXHUwMTUyXDE2XDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTU1IiwKKyAgICAgICAgICAgICJcMVx1MDE1MiIsCisgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlw1XDcwXDFcdTAxNTRcNVw3MFwxXHUwMTUzXDE2XDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTU2IiwKKyAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTU3IiwKKyAgICAgICAgICAgICJcMVx1MDE1OCIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxNTkiLAorICAgICAgICAgICAgIlwxXHUwMTVhIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTViIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTVjIiwKLSAgICAgICAgICAgICJcMVx1MDE1ZVwxNVx1ZmZmZlwxXHUwMTVkIiwKICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIlwxXHUwMTVmIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZCIsCisgICAgICAgICAgICAiXDFcdTAxNWZcMTVcdWZmZmZcMVx1MDE1ZSIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2MCIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2MSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2MiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE2MyIsCiAgICAgICAgICAgICAiXDFcdTAxNjQiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNjUiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNjYiLAorICAgICAgICAgICAgIlwxXHUwMTY3IiwKICAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxNjkiLAogICAgICAgICAgICAgIlwxXHUwMTZhIiwKICAgICAgICAgICAgICJcMVx1MDE2YiIsCiAgICAgICAgICAgICAiXDFcdTAxNmMiLAogICAgICAgICAgICAgIlwxXHUwMTZkIiwKKyAgICAgICAgICAgICJcMVx1MDE2ZSIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxNmYiLAogICAgICAgICAgICAgIlwxXHUwMTcwIiwKICAgICAgICAgICAgICJcMVx1MDE3MSIsCiAgICAgICAgICAgICAiXDFcdTAxNzIiLAogICAgICAgICAgICAgIlwxXHUwMTczIiwKICAgICAgICAgICAgICJcMVx1MDE3NCIsCi0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXHUwMTc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxNzYiLAogICAgICAgICAgICAgIlwxXHUwMTc3IiwKICAgICAgICAgICAgICJcMVx1MDE3OCIsCiAgICAgICAgICAgICAiXDFcdTAxNzkiLAotICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxN2EiLAorICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcdTAxN2IiLAogICAgICAgICAgICAgIlwxXHUwMTdjIiwKICAgICAgICAgICAgICJcMVx1MDE3ZCIsCisgICAgICAgICAgICAiXDFcdTAxN2UiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTgwIiwKICAgICAgICAgICAgICJcMVx1MDE4MSIsCiAgICAgICAgICAgICAiXDFcdTAxODIiLAogICAgICAgICAgICAgIlwxXHUwMTgzIiwKQEAgLTQxNjYsMjUgKzQyMTAsMjUgQEAKICAgICAgICAgICAgICJcMVx1MDE4NiIsCiAgICAgICAgICAgICAiXDFcdTAxODciLAogICAgICAgICAgICAgIlwxXHUwMTg4IiwKKyAgICAgICAgICAgICJcMVx1MDE4OSIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMThhIiwKICAgICAgICAgICAgICJcMVx1MDE4YiIsCiAgICAgICAgICAgICAiXDFcdTAxOGMiLAogICAgICAgICAgICAgIlwxXHUwMThkIiwKICAgICAgICAgICAgICJcMVx1MDE4ZSIsCisgICAgICAgICAgICAiXDFcdTAxOGYiLAogICAgICAgICAgICAgIlwxXDcwXDEzXHVmZmZmXDEyXDcwXDdcdWZmZmZcMzJcNzBcNFx1ZmZmZlwxXDcwXDFcdWZmZmZcMzJcNzAiLAotICAgICAgICAgICAgIlwxXHUwMTkwIiwKICAgICAgICAgICAgICJcMVx1MDE5MSIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE5MiIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE5MyIsCiAgICAgICAgICAgICAiXDFcdTAxOTQiLAogICAgICAgICAgICAgIlwxXHUwMTk1IiwKICAgICAgICAgICAgICJcMVx1MDE5NiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE5NyIsCisgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDE5OCIsCiAgICAgICAgICAgICAiXDFcdTAxOTkiLAogICAgICAgICAgICAgIlwxXHUwMTlhIiwKQEAgLTQyMDEsMjAgKzQyNDUsMjEgQEAKICAgICAgICAgICAgICJcMVx1MDFhNSIsCiAgICAgICAgICAgICAiXDFcdTAxYTYiLAogICAgICAgICAgICAgIlwxXHUwMWE3IiwKKyAgICAgICAgICAgICJcMVx1MDFhOCIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCi0gICAgICAgICAgICAiXDFcdTAxYWEiLAogICAgICAgICAgICAgIlwxXHUwMWFiIiwKICAgICAgICAgICAgICJcMVx1MDFhYyIsCisgICAgICAgICAgICAiXDFcdTAxYWQiLAogICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAiXDFcNzBcMTNcdWZmZmZcMTJcNzBcN1x1ZmZmZlwzMlw3MFw0XHVmZmZmXDFcNzBcMVx1ZmZmZlwzMlw3MCIsCiAgICAgICAgICAgICAiIiwKICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiXDFcdTAxYWUiLAotICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAiIiwKICAgICAgICAgICAgICJcMVx1MDFhZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWIwIiwKICAgICAgICAgICAgICJcMVw3MFwxM1x1ZmZmZlwxMlw3MFw3XHVmZmZmXDMyXDcwXDRcdWZmZmZcMVw3MFwxXHVmZmZmXDMyXDcwIiwKICAgICAgICAgICAgICIiCiAgICAgfTsKQEAgLTQyNDksNyArNDI5NCw3IEBACiAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkEyMV90cmFuc2l0aW9uOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IFRfXzIwIHwgVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgVF9fMjcgfCBUX18yOCB8IFRfXzI5IHwgVF9fMzAgfCBUX18zMSB8IFRfXzMyIHwgVF9fMzMgfCBUX18zNCB8IFRfXzM1IHwgVF9fMzYgfCBUX18zNyB8IFRfXzM4IHwgVF9fMzkgfCBUX180MCB8IFRfXzQxIHwgVF9fNDIgfCBUX180MyB8IFRfXzQ0IHwgVF9fNDUgfCBUX180NiB8IFRfXzQ3IHwgVF9fNDggfCBUX180OSB8IFRfXzUwIHwgVF9fNTEgfCBUX181MiB8IFRfXzUzIHwgVF9fNTQgfCBUX181NSB8IFRfXzU2IHwgVF9fNTcgfCBUX181OCB8IFRfXzU5IHwgVF9fNjAgfCBUX182MSB8IFRfXzYyIHwgVF9fNjMgfCBUX182NCB8IFRfXzY1IHwgVF9fNjYgfCBUX182NyB8IFRfXzY4IHwgVF9fNjkgfCBUX183MCB8IFRfXzcxIHwgVF9fNzIgfCBUX183MyB8IFRfXzc0IHwgVF9fNzUgfCBUX183NiB8IFRfXzc3IHwgVF9fNzggfCBUX183OSB8IFRfXzgwIHwgVF9fODEgfCBUX184MiB8IFRfXzgzIHwgVF9fODQgfCBUX184NSB8IFRfXzg2IHwgVF9fODcgfCBUX184OCB8IFRfXzg5IHwgVF9fOTAgfCBUX185MSB8IFRfXzkyIHwgVF9fOTMgfCBUX185NCB8IFRfXzk1IHwgVF9fOTYgfCBUX185NyB8IFRfXzk4IHwgVF9fOTkgfCBUX18xMDAgfCBUX18xMDEgfCBUX18xMDIgfCBUX18xMDMgfCBUX18xMDQgfCBUX18xMDUgfCBUX18xMDYgfCBUX18xMDcgfCBUX18xMDggfCBUX18xMDkgfCBUX18xMTAgfCBSVUxFX0hFWCB8IFJVTEVfSU5UIHwgUlVMRV9ERUNJTUFMIHwgUlVMRV9JRCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgICAgIHJldHVybiAiMToxOiBUb2tlbnMgOiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKTsiOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKICAgICAgICAgICAgIEludFN0cmVhbSBpbnB1dCA9IF9pbnB1dDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxTdHJhdGVneURTTFBhcnNlci5qYXZhCmluZGV4IDE2NGIyOTUuLmIyNGE2ZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbFN0cmF0ZWd5RFNMUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsU3RyYXRlZ3lEU0xQYXJzZXIuamF2YQpAQCAtMSwzICsxLDE4IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kucGFyc2VyLmFudGxyLmludGVybmFsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKQEAgLTIzLDcgKzM4LDcgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQogcHVibGljIGNsYXNzIEludGVybmFsU3RyYXRlZ3lEU0xQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdEludGVybmFsQW50bHJQYXJzZXIgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdG9rZW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLCAiUlVMRV9JRCIsICJSVUxFX1NUUklORyIsICJSVUxFX0hFWCIsICJSVUxFX0lOVCIsICJSVUxFX0RFQ0lNQUwiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIsICJSVUxFX1dTIiwgIlJVTEVfQU5ZX09USEVSIiwgIidwYWNrYWdlJyIsICIneyciLCAiJ30nIiwgIidzdHJhdGVneSciLCAiJ3RhcmdldHMnIiwgIidsYXlvdXRpbmdTdHJhdGVneSciLCAiJ2xheW91dD0nIiwgIidmb2N1c2luZ1N0cmF0ZWd5JyIsICInZWN2aWV3Rm9jdXNpbmdJZD0nIiwgIidmb2N1cz0nIiwgIidrZXlTdHJva2VEZWZpbml0aW9uJyIsICIna2V5Q29kZT0nIiwgIidtb2RpZmllcktleXMnIiwgIidmb2N1c2luZ0VuaGFuY2VyJyIsICInZGVmYXVsdCciLCAiJ2RlZmF1bHRMYXlvdXRpbmc9JyIsICInZGVmYXVsdEZvY3VzaW5nPSciLCAiJ2ltcG9ydCciLCAiJ3N0YXRpYyciLCAiJ2V4dGVuc2lvbiciLCAiJyonIiwgIiducyciLCAiJzsnIiwgIidAJyIsICInKCciLCAiJywnIiwgIicpJyIsICInPSciLCAiJyMnIiwgIidbJyIsICInXSciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic8JyIsICInPiciLCAiJz49JyIsICInfHwnIiwgIicmJiciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIidpbnN0YW5jZW9mJyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIictJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIidhcyciLCAiJysrJyIsICInLS0nIiwgIicuJyIsICInOjonIiwgIic/LiciLCAiJ3wnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInY2FzZSciLCAiJ2ZvciciLCAiJ3doaWxlJyIsICInZG8nIiwgIid2YXInIiwgIid2YWwnIiwgIidleHRlbmRzJyIsICInc3VwZXInIiwgIiduZXcnIiwgIidmYWxzZSciLCAiJ3RydWUnIiwgIidudWxsJyIsICIndHlwZW9mJyIsICIndGhyb3cnIiwgIidyZXR1cm4nIiwgIid0cnknIiwgIidmaW5hbGx5JyIsICInc3luY2hyb25pemVkJyIsICInY2F0Y2gnIiwgIic/JyIsICInJiciLCAiJ0hvcml6b250YWwnIiwgIidWZXJ0aWNhbCciLCAiJ0dyaWQnIiwgIidGb3JtMiciLCAiJ0Zvcm0zJyIsICInQ3NzJyIsICInRm9yd2FyZCciLCAiJ0JhY2t3YXJkJyIKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJSVUxFX0lEIiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSEVYIiwgIlJVTEVfSU5UIiwgIlJVTEVfREVDSU1BTCIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiwgIlJVTEVfV1MiLCAiUlVMRV9BTllfT1RIRVIiLCAiJ3BhY2thZ2UnIiwgIid7JyIsICInfSciLCAiJ3N0cmF0ZWd5JyIsICIndGFyZ2V0cyciLCAiJ2xheW91dGluZ1N0cmF0ZWd5JyIsICInbGF5b3V0PSciLCAiJ2ZvY3VzaW5nU3RyYXRlZ3knIiwgIidlY3ZpZXdGb2N1c2luZ0lkPSciLCAiJ2ZvY3VzPSciLCAiJ2tleVN0cm9rZURlZmluaXRpb24nIiwgIidrZXlDb2RlPSciLCAiJ21vZGlmaWVyS2V5cyciLCAiJ2ZvY3VzaW5nRW5oYW5jZXInIiwgIidkZWZhdWx0JyIsICInZGVmYXVsdExheW91dGluZz0nIiwgIidkZWZhdWx0Rm9jdXNpbmc9JyIsICInaW1wb3J0JyIsICInc3RhdGljJyIsICInZXh0ZW5zaW9uJyIsICInKiciLCAiJ25zJyIsICInOyciLCAiJ0AnIiwgIicoJyIsICInLCciLCAiJyknIiwgIic9JyIsICInIyciLCAiJ1snIiwgIiddJyIsICInKz0nIiwgIictPSciLCAiJyo9JyIsICInLz0nIiwgIiclPSciLCAiJzwnIiwgIic+JyIsICInPj0nIiwgIid8fCciLCAiJyYmJyIsICInPT0nIiwgIichPSciLCAiJz09PSciLCAiJyE9PSciLCAiJ2luc3RhbmNlb2YnIiwgIictPiciLCAiJy4uPCciLCAiJy4uJyIsICInPT4nIiwgIic8PiciLCAiJz86JyIsICInKyciLCAiJy0nIiwgIicqKiciLCAiJy8nIiwgIiclJyIsICInISciLCAiJ2FzJyIsICInKysnIiwgIictLSciLCAiJy4nIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJ2lmJyIsICInZWxzZSciLCAiJ3N3aXRjaCciLCAiJzonIiwgIidjYXNlJyIsICInZm9yJyIsICInd2hpbGUnIiwgIidkbyciLCAiJ3ZhciciLCAiJ3ZhbCciLCAiJ2V4dGVuZHMnIiwgIidzdXBlciciLCAiJ25ldyciLCAiJ2ZhbHNlJyIsICIndHJ1ZSciLCAiJ251bGwnIiwgIid0eXBlb2YnIiwgIid0aHJvdyciLCAiJ3JldHVybiciLCAiJ3RyeSciLCAiJ2ZpbmFsbHknIiwgIidzeW5jaHJvbml6ZWQnIiwgIidjYXRjaCciLCAiJz8nIiwgIicmJyIsICInSG9yaXpvbnRhbCciLCAiJ1ZlcnRpY2FsJyIsICInR3JpZCciLCAiJ0Zvcm0nIiwgIidGb3JtMiciLCAiJ0Zvcm0zJyIsICInQ3NzJyIsICInRm9yd2FyZCciLCAiJ0JhY2t3YXJkJyIKICAgICB9OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTY7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CkBAIC0xMTQsNiArMTI5LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MD04MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTE9MTExOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMD0xMTA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CkBAIC0yMDk4NCw3ICsyMTAwMCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUxheW91dGluZ0VudW0iCi0gICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MDc6MTogcnVsZUxheW91dGluZ0VudW0gcmV0dXJucyBbRW51bWVyYXRvciBjdXJyZW50PW51bGxdIDogKCAoZW51bUxpdGVyYWxfMD0gJ0hvcml6b250YWwnICkgfCAoZW51bUxpdGVyYWxfMT0gJ1ZlcnRpY2FsJyApIHwgKGVudW1MaXRlcmFsXzI9ICdHcmlkJyApIHwgKGVudW1MaXRlcmFsXzM9ICdGb3JtMicgKSB8IChlbnVtTGl0ZXJhbF80PSAnRm9ybTMnICkgfCAoZW51bUxpdGVyYWxfNT0gJ0NzcycgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYwNzoxOiBydWxlTGF5b3V0aW5nRW51bSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gOiAoIChlbnVtTGl0ZXJhbF8wPSAnSG9yaXpvbnRhbCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnVmVydGljYWwnICkgfCAoZW51bUxpdGVyYWxfMj0gJ0dyaWQnICkgfCAoZW51bUxpdGVyYWxfMz0gJ0Zvcm0nICkgfCAoZW51bUxpdGVyYWxfND0gJ0Zvcm0yJyApIHwgKGVudW1MaXRlcmFsXzU9ICdGb3JtMycgKSB8IChlbnVtTGl0ZXJhbF82PSAnQ3NzJyApICkgOwogICAgIHB1YmxpYyBmaW5hbCBFbnVtZXJhdG9yIHJ1bGVMYXlvdXRpbmdFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjA5OTQsMTYgKzIxMDEwLDE3IEBACiAgICAgICAgIFRva2VuIGVudW1MaXRlcmFsXzM9bnVsbDsKICAgICAgICAgVG9rZW4gZW51bUxpdGVyYWxfND1udWxsOwogICAgICAgICBUb2tlbiBlbnVtTGl0ZXJhbF81PW51bGw7CisgICAgICAgIFRva2VuIGVudW1MaXRlcmFsXzY9bnVsbDsKIAogCiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MTM6MjogKCAoIChlbnVtTGl0ZXJhbF8wPSAnSG9yaXpvbnRhbCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnVmVydGljYWwnICkgfCAoZW51bUxpdGVyYWxfMj0gJ0dyaWQnICkgfCAoZW51bUxpdGVyYWxfMz0gJ0Zvcm0yJyApIHwgKGVudW1MaXRlcmFsXzQ9ICdGb3JtMycgKSB8IChlbnVtTGl0ZXJhbF81PSAnQ3NzJyApICkgKQotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MTQ6MjogKCAoZW51bUxpdGVyYWxfMD0gJ0hvcml6b250YWwnICkgfCAoZW51bUxpdGVyYWxfMT0gJ1ZlcnRpY2FsJyApIHwgKGVudW1MaXRlcmFsXzI9ICdHcmlkJyApIHwgKGVudW1MaXRlcmFsXzM9ICdGb3JtMicgKSB8IChlbnVtTGl0ZXJhbF80PSAnRm9ybTMnICkgfCAoZW51bUxpdGVyYWxfNT0gJ0NzcycgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYxMzoyOiAoICggKGVudW1MaXRlcmFsXzA9ICdIb3Jpem9udGFsJyApIHwgKGVudW1MaXRlcmFsXzE9ICdWZXJ0aWNhbCcgKSB8IChlbnVtTGl0ZXJhbF8yPSAnR3JpZCcgKSB8IChlbnVtTGl0ZXJhbF8zPSAnRm9ybScgKSB8IChlbnVtTGl0ZXJhbF80PSAnRm9ybTInICkgfCAoZW51bUxpdGVyYWxfNT0gJ0Zvcm0zJyApIHwgKGVudW1MaXRlcmFsXzY9ICdDc3MnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzYxNDoyOiAoIChlbnVtTGl0ZXJhbF8wPSAnSG9yaXpvbnRhbCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnVmVydGljYWwnICkgfCAoZW51bUxpdGVyYWxfMj0gJ0dyaWQnICkgfCAoZW51bUxpdGVyYWxfMz0gJ0Zvcm0nICkgfCAoZW51bUxpdGVyYWxfND0gJ0Zvcm0yJyApIHwgKGVudW1MaXRlcmFsXzU9ICdGb3JtMycgKSB8IChlbnVtTGl0ZXJhbF82PSAnQ3NzJyApICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjE0OjI6ICggKGVudW1MaXRlcmFsXzA9ICdIb3Jpem9udGFsJyApIHwgKGVudW1MaXRlcmFsXzE9ICdWZXJ0aWNhbCcgKSB8IChlbnVtTGl0ZXJhbF8yPSAnR3JpZCcgKSB8IChlbnVtTGl0ZXJhbF8zPSAnRm9ybTInICkgfCAoZW51bUxpdGVyYWxfND0gJ0Zvcm0zJyApIHwgKGVudW1MaXRlcmFsXzU9ICdDc3MnICkgKQotICAgICAgICAgICAgaW50IGFsdDEzNT02OworICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2MTQ6MjogKCAoZW51bUxpdGVyYWxfMD0gJ0hvcml6b250YWwnICkgfCAoZW51bUxpdGVyYWxfMT0gJ1ZlcnRpY2FsJyApIHwgKGVudW1MaXRlcmFsXzI9ICdHcmlkJyApIHwgKGVudW1MaXRlcmFsXzM9ICdGb3JtJyApIHwgKGVudW1MaXRlcmFsXzQ9ICdGb3JtMicgKSB8IChlbnVtTGl0ZXJhbF81PSAnRm9ybTMnICkgfCAoZW51bUxpdGVyYWxfNj0gJ0NzcycgKSApCisgICAgICAgICAgICBpbnQgYWx0MTM1PTc7CiAgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKICAgICAgICAgICAgIGNhc2UgMTAzOgogICAgICAgICAgICAgICAgIHsKQEAgLTIxMDM1LDYgKzIxMDUyLDExIEBACiAgICAgICAgICAgICAgICAgYWx0MTM1PTY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDEzNT03OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KQEAgLTIxMTAyLDE2ICsyMTEyNCwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjM5OjM6IChlbnVtTGl0ZXJhbF8zPSAnRm9ybTInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2Mzk6MzogKGVudW1MaXRlcmFsXzM9ICdGb3JtJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2Mzk6MzogKGVudW1MaXRlcmFsXzM9ICdGb3JtMicgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0MDo0OiBlbnVtTGl0ZXJhbF8zPSAnRm9ybTInCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjM5OjM6IChlbnVtTGl0ZXJhbF8zPSAnRm9ybScgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0MDo0OiBlbnVtTGl0ZXJhbF8zPSAnRm9ybScKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8zPShUb2tlbiltYXRjaChpbnB1dCwxMDYsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgIAkJCQluZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8zLCBncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRGT1JNMkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzMsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgCQkJCiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjExMjEsMTYgKzIxMTQzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSA1IDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NDc6MzogKGVudW1MaXRlcmFsXzQ9ICdGb3JtMycgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0NzozOiAoZW51bUxpdGVyYWxfND0gJ0Zvcm0yJyApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NDc6MzogKGVudW1MaXRlcmFsXzQ9ICdGb3JtMycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY0ODo0OiBlbnVtTGl0ZXJhbF80PSAnRm9ybTMnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjQ3OjM6IChlbnVtTGl0ZXJhbF80PSAnRm9ybTInICkKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NDg6NDogZW51bUxpdGVyYWxfND0gJ0Zvcm0yJwogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzQ9KFRva2VuKW1hdGNoKGlucHV0LDEwNyxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAotICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzQsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzQsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOwogICAgICAgICAgICAgICAgICAgICAgIAkJCQogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTIxMTQwLDE2ICsyMTE2MiwzNSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgNiA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjU1OjM6IChlbnVtTGl0ZXJhbF81PSAnQ3NzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjU1OjM6IChlbnVtTGl0ZXJhbF81PSAnRm9ybTMnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY1NTozOiAoZW51bUxpdGVyYWxfNT0gJ0NzcycgKQotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY1Njo0OiBlbnVtTGl0ZXJhbF81PSAnQ3NzJworICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY1NTozOiAoZW51bUxpdGVyYWxfNT0gJ0Zvcm0zJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjU2OjQ6IGVudW1MaXRlcmFsXzU9ICdGb3JtMycKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF81PShUb2tlbiltYXRjaChpbnB1dCwxMDgsRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldENTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAJCQkJbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNSwgZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Q1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkuZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzUsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldEZPUk0zRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOworICAgICAgICAgICAgICAgICAgICAgIAkJCQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY2MzozOiAoZW51bUxpdGVyYWxfNj0gJ0NzcycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjYzOjM6IChlbnVtTGl0ZXJhbF82PSAnQ3NzJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjY0OjQ6IGVudW1MaXRlcmFsXzY9ICdDc3MnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfNj0oVG9rZW4pbWF0Y2goaW5wdXQsMTA5LEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldExheW91dGluZ0VudW1BY2Nlc3MoKS5nZXRDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgCQkJCW5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzYsIGdyYW1tYXJBY2Nlc3MuZ2V0TGF5b3V0aW5nRW51bUFjY2VzcygpLmdldENTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpKTsKICAgICAgICAgICAgICAgICAgICAgICAJCQkKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yMTE4Myw3ICsyMTIyNCw3IEBACiAKIAogICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUZvY3VzaW5nRW51bSIKLSAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY2NjoxOiBydWxlRm9jdXNpbmdFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICdGb3J3YXJkJyApIHwgKGVudW1MaXRlcmFsXzE9ICdCYWNrd2FyZCcgKSApIDsKKyAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY3NDoxOiBydWxlRm9jdXNpbmdFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSA6ICggKGVudW1MaXRlcmFsXzA9ICdGb3J3YXJkJyApIHwgKGVudW1MaXRlcmFsXzE9ICdCYWNrd2FyZCcgKSApIDsKICAgICBwdWJsaWMgZmluYWwgRW51bWVyYXRvciBydWxlRm9jdXNpbmdFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKIApAQCAtMjExOTQsMTcgKzIxMjM1LDE3IEBACiAgICAgICAgIAllbnRlclJ1bGUoKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NzI6MjogKCAoIChlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnQmFja3dhcmQnICkgKSApCi0gICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY3MzoyOiAoIChlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnQmFja3dhcmQnICkgKQorICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2ODA6MjogKCAoIChlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnQmFja3dhcmQnICkgKSApCisgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY4MToyOiAoIChlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcgKSB8IChlbnVtTGl0ZXJhbF8xPSAnQmFja3dhcmQnICkgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NzM6MjogKCAoZW51bUxpdGVyYWxfMD0gJ0ZvcndhcmQnICkgfCAoZW51bUxpdGVyYWxfMT0gJ0JhY2t3YXJkJyApICkKKyAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjgxOjI6ICggKGVudW1MaXRlcmFsXzA9ICdGb3J3YXJkJyApIHwgKGVudW1MaXRlcmFsXzE9ICdCYWNrd2FyZCcgKSApCiAgICAgICAgICAgICBpbnQgYWx0MTM2PTI7CiAgICAgICAgICAgICBpbnQgTEExMzZfMCA9IGlucHV0LkxBKDEpOwogCi0gICAgICAgICAgICBpZiAoIChMQTEzNl8wPT0xMDkpICkgeworICAgICAgICAgICAgaWYgKCAoTEExMzZfMD09MTEwKSApIHsKICAgICAgICAgICAgICAgICBhbHQxMzY9MTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMzZfMD09MTEwKSApIHsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMzZfMD09MTExKSApIHsKICAgICAgICAgICAgICAgICBhbHQxMzY9MjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtMjEyMTYsMTIgKzIxMjU3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNikgewogICAgICAgICAgICAgICAgIGNhc2UgMSA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3Njc0OjM6IChlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY4MjozOiAoZW51bUxpdGVyYWxfMD0gJ0ZvcndhcmQnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY3NDozOiAoZW51bUxpdGVyYWxfMD0gJ0ZvcndhcmQnICkKLSAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2NzU6NDogZW51bUxpdGVyYWxfMD0gJ0ZvcndhcmQnCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjgyOjM6IChlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY4Mzo0OiBlbnVtTGl0ZXJhbF8wPSAnRm9yd2FyZCcKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbnVtTGl0ZXJhbF8wPShUb2tlbiltYXRjaChpbnB1dCwxMDksRk9MTE9XXzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTEwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgewogCiAgICAgICAgICAgICAgICAgICAgICAgCQkJCWN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldEZvY3VzaW5nRW51bUFjY2VzcygpLmdldEZPUldBUkRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CkBAIC0yMTIzNSwxMiArMjEyNzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDIgOgotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY4MjozOiAoZW51bUxpdGVyYWxfMT0gJ0JhY2t3YXJkJyApCisgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjkwOjM6IChlbnVtTGl0ZXJhbF8xPSAnQmFja3dhcmQnICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY4MjozOiAoZW51bUxpdGVyYWxfMT0gJ0JhY2t3YXJkJyApCi0gICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsU3RyYXRlZ3lEU0wuZzo3NjgzOjQ6IGVudW1MaXRlcmFsXzE9ICdCYWNrd2FyZCcKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWxTdHJhdGVneURTTC5nOjc2OTA6MzogKGVudW1MaXRlcmFsXzE9ICdCYWNrd2FyZCcgKQorICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbFN0cmF0ZWd5RFNMLmc6NzY5MTo0OiBlbnVtTGl0ZXJhbF8xPSAnQmFja3dhcmQnCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZW51bUxpdGVyYWxfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTEwLEZPTExPV18yKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGVudW1MaXRlcmFsXzE9KFRva2VuKW1hdGNoKGlucHV0LDExMSxGT0xMT1dfMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKIAogICAgICAgICAgICAgICAgICAgICAgIAkJCQljdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRGb2N1c2luZ0VudW1BY2Nlc3MoKS5nZXRCQUNLV0FSREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKQEAgLTI2MzA5LDEwICsyNjM1MCwxMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDQxMDgwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwNDAwODAwMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDgwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDFGODAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDAzRjgwMDAwMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAwMDAwTH0pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMLDB4MDAwMDYwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTCwweDAwMDBDMDAwMDAwMDAwMDBMfSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDgwMDAwMkx9KTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAxMDAwMDAwTH0pOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDIwMDgwMDBMfSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9zY29waW5nL0Fic3RyYWN0U3RyYXRlZ3lEU0xTY29wZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9zY29waW5nL0Fic3RyYWN0U3RyYXRlZ3lEU0xTY29wZVByb3ZpZGVyLmphdmEKaW5kZXggNWU5NTgxNy4uMWFmMDM3ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2NvcGluZy9BYnN0cmFjdFN0cmF0ZWd5RFNMU2NvcGVQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Njb3BpbmcvQWJzdHJhY3RTdHJhdGVneURTTFNjb3BlUHJvdmlkZXIuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNjb3Bpbmc7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3NlcmlhbGl6ZXIvU3RyYXRlZ3lEU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VyaWFsaXplci9TdHJhdGVneURTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKaW5kZXggMGRlMWM3Mi4uZTg1ZWRhNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VyaWFsaXplci9TdHJhdGVneURTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VyaWFsaXplci9TdHJhdGVneURTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZXJpYWxpemVyOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9zZXJpYWxpemVyL1N0cmF0ZWd5RFNMU3ludGFjdGljU2VxdWVuY2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9zZXJpYWxpemVyL1N0cmF0ZWd5RFNMU3ludGFjdGljU2VxdWVuY2VyLmphdmEKaW5kZXggYzUzZmExNy4uYTFlMjZjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VyaWFsaXplci9TdHJhdGVneURTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3NlcmlhbGl6ZXIvU3RyYXRlZ3lEU0xTeW50YWN0aWNTZXF1ZW5jZXIuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnNlcmlhbGl6ZXI7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3NlcnZpY2VzL1N0cmF0ZWd5RFNMR3JhbW1hckFjY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VydmljZXMvU3RyYXRlZ3lEU0xHcmFtbWFyQWNjZXNzLmphdmEKaW5kZXggNzE2Nzg2YS4uMTBhNmNlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VydmljZXMvU3RyYXRlZ3lEU0xHcmFtbWFyQWNjZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2VydmljZXMvU3RyYXRlZ3lEU0xHcmFtbWFyQWNjZXNzLmphdmEKQEAgLTEsNSArMSwxNyBAQAotLyoKLSAqIGdlbmVyYXRlZCBieSBYdGV4dCAyLjExLjAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5zZXJ2aWNlczsKIApAQCAtNDY4LDE4ICs0ODAsMjAgQEAKIAkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNWRVJUSUNBTFZlcnRpY2FsS2V5d29yZF8xXzAgPSAoS2V5d29yZCljVkVSVElDQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOwogCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0dSSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKIAkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNHUklER3JpZEtleXdvcmRfMl8wID0gKEtleXdvcmQpY0dSSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOwotCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0ZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMyk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRk9STTJGb3JtMktleXdvcmRfM18wID0gKEtleXdvcmQpY0ZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zLmVDb250ZW50cygpLmdldCgwKTsKLQkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNGT1JNM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOwotCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ZPUk0zRm9ybTNLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNGT1JNM0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNC5lQ29udGVudHMoKS5nZXQoMCk7Ci0JCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQ1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81ID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNSk7Ci0JCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ1NTQ3NzS2V5d29yZF81XzAgPSAoS2V5d29yZCljQ1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNGT1JNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRk9STUZvcm1LZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNGT1JNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNGT1JNMkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ZPUk0yRm9ybTJLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNGT1JNMkVudW1MaXRlcmFsRGVjbGFyYXRpb25fNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjRk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGT1JNM0Zvcm0zS2V5d29yZF81XzAgPSAoS2V5d29yZCljRk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NTU0Nzc0tleXdvcmRfNl8wID0gKEtleXdvcmQpY0NTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNi5lQ29udGVudHMoKS5nZXQoMCk7CiAJCQogCQkvL2VudW0gTGF5b3V0aW5nRW51bToKLQkJLy8JSE9SSVpPTlRBTD0nSG9yaXpvbnRhbCcgfCBWRVJUSUNBTD0nVmVydGljYWwnIHwgR1JJRD0nR3JpZCcgfCBGT1JNMj0nRm9ybTInIHwgRk9STTM9J0Zvcm0zJyB8IENTUz0nQ3NzJzsKKwkJLy8JSE9SSVpPTlRBTD0nSG9yaXpvbnRhbCcgfCBWRVJUSUNBTD0nVmVydGljYWwnIHwgR1JJRD0nR3JpZCcgfCBGT1JNPSdGb3JtJyB8IEZPUk0yPSdGb3JtMicgfCBGT1JNMz0nRm9ybTMnIHwgQ1NTPSdDc3MnOwogCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KIAkJCi0JCS8vSE9SSVpPTlRBTD0nSG9yaXpvbnRhbCcgfCBWRVJUSUNBTD0nVmVydGljYWwnIHwgR1JJRD0nR3JpZCcgfCBGT1JNMj0nRm9ybTInIHwgRk9STTM9J0Zvcm0zJyB8IENTUz0nQ3NzJworCQkvL0hPUklaT05UQUw9J0hvcml6b250YWwnIHwgVkVSVElDQUw9J1ZlcnRpY2FsJyB8IEdSSUQ9J0dyaWQnIHwgRk9STT0nRm9ybScgfCBGT1JNMj0nRm9ybTInIHwgRk9STTM9J0Zvcm0zJyB8IENTUz0nQ3NzJwogCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KIAkJCiAJCS8vSE9SSVpPTlRBTD0nSG9yaXpvbnRhbCcKQEAgLTUwMCwyMyArNTE0LDI5IEBACiAJCS8vJ0dyaWQnCiAJCXB1YmxpYyBLZXl3b3JkIGdldEdSSURHcmlkS2V5d29yZF8yXzAoKSB7IHJldHVybiBjR1JJREdyaWRLZXl3b3JkXzJfMDsgfQogCQkKKwkJLy9GT1JNPSdGb3JtJworCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRGT1JNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY0ZPUk1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzM7IH0KKwkJCisJCS8vJ0Zvcm0nCisJCXB1YmxpYyBLZXl3b3JkIGdldEZPUk1Gb3JtS2V5d29yZF8zXzAoKSB7IHJldHVybiBjRk9STUZvcm1LZXl3b3JkXzNfMDsgfQorCQkKIAkJLy9GT1JNMj0nRm9ybTInCi0JCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY0ZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkgeyByZXR1cm4gY0ZPUk0yRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80OyB9CiAJCQogCQkvLydGb3JtMicKLQkJcHVibGljIEtleXdvcmQgZ2V0Rk9STTJGb3JtMktleXdvcmRfM18wKCkgeyByZXR1cm4gY0ZPUk0yRm9ybTJLZXl3b3JkXzNfMDsgfQorCQlwdWJsaWMgS2V5d29yZCBnZXRGT1JNMkZvcm0yS2V5d29yZF80XzAoKSB7IHJldHVybiBjRk9STTJGb3JtMktleXdvcmRfNF8wOyB9CiAJCQogCQkvL0ZPUk0zPSdGb3JtMycKLQkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjRk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Rk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUoKSB7IHJldHVybiBjRk9STTNFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzU7IH0KIAkJCiAJCS8vJ0Zvcm0zJwotCQlwdWJsaWMgS2V5d29yZCBnZXRGT1JNM0Zvcm0zS2V5d29yZF80XzAoKSB7IHJldHVybiBjRk9STTNGb3JtM0tleXdvcmRfNF8wOyB9CisJCXB1YmxpYyBLZXl3b3JkIGdldEZPUk0zRm9ybTNLZXl3b3JkXzVfMCgpIHsgcmV0dXJuIGNGT1JNM0Zvcm0zS2V5d29yZF81XzA7IH0KIAkJCiAJCS8vQ1NTPSdDc3MnCi0JCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldENTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpIHsgcmV0dXJuIGNDU1NFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzU7IH0KKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Q1NTRW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkgeyByZXR1cm4gY0NTU0VudW1MaXRlcmFsRGVjbGFyYXRpb25fNjsgfQogCQkKIAkJLy8nQ3NzJwotCQlwdWJsaWMgS2V5d29yZCBnZXRDU1NDc3NLZXl3b3JkXzVfMCgpIHsgcmV0dXJuIGNDU1NDc3NLZXl3b3JkXzVfMDsgfQorCQlwdWJsaWMgS2V5d29yZCBnZXRDU1NDc3NLZXl3b3JkXzZfMCgpIHsgcmV0dXJuIGNDU1NDc3NLZXl3b3JkXzZfMDsgfQogCX0KIAlwdWJsaWMgY2xhc3MgRm9jdXNpbmdFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CiAJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kuU3RyYXRlZ3lEU0wuRm9jdXNpbmdFbnVtIik7CkBAIC03MTQsNyArNzM0LDcgQEAKIAl9CiAJCiAJLy9lbnVtIExheW91dGluZ0VudW06Ci0JLy8JSE9SSVpPTlRBTD0nSG9yaXpvbnRhbCcgfCBWRVJUSUNBTD0nVmVydGljYWwnIHwgR1JJRD0nR3JpZCcgfCBGT1JNMj0nRm9ybTInIHwgRk9STTM9J0Zvcm0zJyB8IENTUz0nQ3NzJzsKKwkvLwlIT1JJWk9OVEFMPSdIb3Jpem9udGFsJyB8IFZFUlRJQ0FMPSdWZXJ0aWNhbCcgfCBHUklEPSdHcmlkJyB8IEZPUk09J0Zvcm0nIHwgRk9STTI9J0Zvcm0yJyB8IEZPUk0zPSdGb3JtMycgfCBDU1M9J0Nzcyc7CiAJcHVibGljIExheW91dGluZ0VudW1FbGVtZW50cyBnZXRMYXlvdXRpbmdFbnVtQWNjZXNzKCkgewogCQlyZXR1cm4gZUxheW91dGluZ0VudW07CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdmFsaWRhdGlvbi9BYnN0cmFjdFN0cmF0ZWd5RFNMVmFsaWRhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWxpZGF0aW9uL0Fic3RyYWN0U3RyYXRlZ3lEU0xWYWxpZGF0b3IuamF2YQppbmRleCA1MWU0MjdjLi40NDU0ZmYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWxpZGF0aW9uL0Fic3RyYWN0U3RyYXRlZ3lEU0xWYWxpZGF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWxpZGF0aW9uL0Fic3RyYWN0U3RyYXRlZ3lEU0xWYWxpZGF0b3IuamF2YQpAQCAtMSw1ICsxLDE3IEBACi0vKgotICogZ2VuZXJhdGVkIGJ5IFh0ZXh0IDIuMTEuMAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5LnZhbGlkYXRpb247CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0FjdGl2YXRvci5qYXZhCmluZGV4IDYwMzZkNjUuLmRiNThjNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvQWN0aXZhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9BY3RpdmF0b3IuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9HZW5lcmF0ZVN0cmF0ZWd5RFNMLm13ZTIgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0dlbmVyYXRlU3RyYXRlZ3lEU0wubXdlMgppbmRleCA4ZmVlOTU1Li5lYjNlMThjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0dlbmVyYXRlU3RyYXRlZ3lEU0wubXdlMgorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L0dlbmVyYXRlU3RyYXRlZ3lEU0wubXdlMgpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMTgsNiArMjAsMjQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54dGV4dC5nZW5lcmF0b3IubW9kZWwucHJvamVjdC4qCiAKIHZhciByb290UGF0aCA9ICIuLiIKK3ZhciBmaWxlSGVhZGVyVGV4dD0iLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICogIGdlbmVyYXRlZCBieSBYdGV4dCBcJHt2ZXJzaW9ufQorICoKKyAqLworIgogCiBXb3JrZmxvdyB7CiAKQEAgLTQ0LDcgKzY0LDcgQEAKIAkJCWNvZGUgPSB7CiAJCQkJZW5jb2RpbmcgPSAiVVRGLTgiCiAJCQkJbGluZURlbGltaXRlciA9ICJcbiIKLQkJCQlmaWxlSGVhZGVyID0gIi8qXG4gKiBnZW5lcmF0ZWQgYnkgWHRleHQgXCR7dmVyc2lvbn1cbiAqLyIKKwkJCQlmaWxlSGVhZGVyID0gZmlsZUhlYWRlclRleHQKIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMLnh0ZXh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTC54dGV4dAppbmRleCBhNTk3M2E0Li45Y2IxMzk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMLnh0ZXh0CisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEU0wueHRleHQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KQEAgLTQ2LDcgKzQ4LDcgQEAKIAlkZWZhdWx0Rm9jdXNpbmc9W0ZvY3VzaW5nRW5oYW5jZXJdICd9JzsKIAogZW51bSBMYXlvdXRpbmdFbnVtOgotCUhPUklaT05UQUw9J0hvcml6b250YWwnIHwgVkVSVElDQUw9J1ZlcnRpY2FsJyB8IEdSSUQ9J0dyaWQnIHwgRk9STTI9J0Zvcm0yJyB8IEZPUk0zPSdGb3JtMycgfCBDU1M9J0Nzcyc7CisJSE9SSVpPTlRBTD0nSG9yaXpvbnRhbCcgfCBWRVJUSUNBTD0nVmVydGljYWwnIHwgR1JJRD0nR3JpZCcgfCBGT1JNPSdGb3JtJyB8IEZPUk0yPSdGb3JtMicgfCBGT1JNMz0nRm9ybTMnIHwgQ1NTPSdDc3MnOwogCiBlbnVtIEZvY3VzaW5nRW51bToKIAlGT1JXQVJEPSdGb3J3YXJkJyB8IEJBQ0tXQVJEPSdCYWNrd2FyZCc7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEKaW5kZXggYTYzNWI1MS4uNzQyZjBhNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YQppbmRleCA2YjA5MjYyLi43NDVjZjA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTFJ1bnRpbWVNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEU0xSdW50aW1lTW9kdWxlLmphdmEKaW5kZXggNTg4NmE0ZC4uYTRmMDYyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTFJ1bnRpbWVNb2R1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMUnVudGltZU1vZHVsZS5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMU3RhbmRhbG9uZVNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1N0cmF0ZWd5RFNMU3RhbmRhbG9uZVNldHVwLmphdmEKaW5kZXggYTAxNjM2My4uNmRkYmVjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9TdHJhdGVneURTTFN0YW5kYWxvbmVTZXR1cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvU3RyYXRlZ3lEU0xTdGFuZGFsb25lU2V0dXAuamF2YQpAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhCmluZGV4IDZhMDk2NjQuLjJjMzM1ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvWGNvcmVSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L1hjb3JlUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvY29uc3RhbnRzL1N0cmF0ZWd5Q29uc3RhbnRzLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9jb25zdGFudHMvU3RyYXRlZ3lDb25zdGFudHMueHRlbmQKaW5kZXggMTc3NzU2OS4uZTBmN2M3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9jb25zdGFudHMvU3RyYXRlZ3lDb25zdGFudHMueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9jb25zdGFudHMvU3RyYXRlZ3lDb25zdGFudHMueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZm9ybWF0dGluZy9TdHJhdGVneURTTEZvcm1hdHRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZm9ybWF0dGluZy9TdHJhdGVneURTTEZvcm1hdHRlci54dGVuZAppbmRleCA2YTRlNDE2Li4yZGI3ZGM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2Zvcm1hdHRpbmcvU3RyYXRlZ3lEU0xGb3JtYXR0ZXIueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9mb3JtYXR0aW5nL1N0cmF0ZWd5RFNMRm9ybWF0dGVyLnh0ZW5kCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2dlbmVyYXRvci9TdHJhdGVneURTTEdlbmVyYXRvci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZ2VuZXJhdG9yL1N0cmF0ZWd5RFNMR2VuZXJhdG9yLnh0ZW5kCmluZGV4IGM4ZmRiM2EuLjI2NTdiM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZ2VuZXJhdG9yL1N0cmF0ZWd5RFNMR2VuZXJhdG9yLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZ2VuZXJhdG9yL1N0cmF0ZWd5RFNMR2VuZXJhdG9yLnh0ZW5kCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2ltcG9ydHMvU2hvdWxkSW1wb3J0UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wb3J0cy9TaG91bGRJbXBvcnRQcm92aWRlci5qYXZhCmluZGV4IDNlMjEwNGIuLmZlZDM0MmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wb3J0cy9TaG91bGRJbXBvcnRQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvaW1wb3J0cy9TaG91bGRJbXBvcnRQcm92aWRlci5qYXZhCkBAIC0xLDMgKzEsMTggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS5pbXBvcnRzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xGb2N1c2luZ0VuaGFuY2VyQ3JlYXRvci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xGb2N1c2luZ0VuaGFuY2VyQ3JlYXRvci54dGVuZAppbmRleCBjMTlkMWJjLi4zOGM4YWQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdFbmhhbmNlckNyZWF0b3IueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEZvY3VzaW5nRW5oYW5jZXJDcmVhdG9yLnh0ZW5kCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdTdHJhdGVneUNyZWF0b3IueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdTdHJhdGVneUNyZWF0b3IueHRlbmQKaW5kZXggYTY0OGQ0NS4uNGRhN2E2YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEZvY3VzaW5nU3RyYXRlZ3lDcmVhdG9yLnh0ZW5kCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xGb2N1c2luZ1N0cmF0ZWd5Q3JlYXRvci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMjI3LDcgKzIyOSw3IEBACiAJCQkJaWYgKG5leHRGb2N1c0VsZW1lbnQgPT0gbnVsbCkgewogCQkJCQnCq0lGIGZvY3VzaW5nU3RyYXRlZ3kuZm9jdXMubGl0ZXJhbC5lcXVhbHMoRm9jdXNpbmdFbnVtLkZPUldBUkQubGl0ZXJhbCnCuwogCQkJCQkvLyBpZiBubyBlbGVtZW50IHdhcyBmb3VuZCB0byBmb2N1cyBnbyBiYWNrIHRvIHRoZSBmaXJzdCBlbGVtZW50Ci0JCQkJCW5leHRGb2N1c0VsZW1lbnQgPSAoWUVtYmVkZGFibGUpIHNlcnZpY2UuZ2V0TW9kZWxFbGVtZW50KDEpOworCQkJCQluZXh0Rm9jdXNFbGVtZW50ID0gKFlFbWJlZGRhYmxlKSBzZXJ2aWNlLmdldE1vZGVsRWxlbWVudCgwKTsKIAkJCQkJwqtFTFNFSUYgZm9jdXNpbmdTdHJhdGVneS5mb2N1cy5saXRlcmFsLmVxdWFscyhGb2N1c2luZ0VudW0uQkFDS1dBUkQubGl0ZXJhbCnCuwogCQkJCQkvLyBpZiBubyBlbGVtZW50IHdhcyBmb3VuZCB0byBmb2N1cyBnbyBiYWNrIHRvIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50CiAJCQkJCcKrZm9jdXNpbmdTdHJhdGVneS5maW5kTGFzdEVsZW1lbnRUb0ZvY3VzwrsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xKdm1Nb2RlbEluZmVycmVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQKaW5kZXggMTkzZjlhNi4uNTVjMTRlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xMYXlvdXRpbmdTdHJhdGVneUNyZWF0b3IueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMTGF5b3V0aW5nU3RyYXRlZ3lDcmVhdG9yLnh0ZW5kCmluZGV4IDVhMGE1MWMuLjU1NDA4MWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xMYXlvdXRpbmdTdHJhdGVneUNyZWF0b3IueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTExheW91dGluZ1N0cmF0ZWd5Q3JlYXRvci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtMTk1LDE2ICsxOTcsMTggQEAKIAkJCQkJaWYgKGlkeCA9PSAwKSBmb3JtTGF5b3V0TGlzdC5nZXQoMCkuYWRkRWxlbWVudChlbGVtZW50KTsgZWxzZSBmb3JtTGF5b3V0TGlzdC5nZXQoaWR4KS5hZGRFbGVtZW50KGVsZW1lbnQpOwogCQkJCQlpbmRleCsrOwogCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFlGb2N1c2FibGUpIHsKLQkJCQkJCSgoWUZvY3VzYWJsZSkgZWxlbWVudCkuc2V0TGF5b3V0SWR4KGluZGV4KTsKLQkJCQkJCSgoWUZvY3VzYWJsZSkgZWxlbWVudCkuc2V0TGF5b3V0Q29sdW1ucyjCq21vZElkeMK7KTsKKwkJCQkJCWFwcGx5TmV4dExheW91dGluZ0luZGV4KChZRm9jdXNhYmxlKSBlbGVtZW50KTsKKwkJCQkJCS8vIFRPRE8gLSBmaXggbWUKKwkJCQkJCS8vICgoWUZvY3VzYWJsZSkgZWxlbWVudCkuc2V0TGF5b3V0Q29sdW1ucyhjYWxjdWxhdGVNZSgpKTsKIAkJCQkJfScnJwogCQkJfQogCQl9IGVsc2UgewogCQkJJycnCWxheW91dC5hZGRFbGVtZW50KGVsZW1lbnQpOwogCQkJICAgCWluZGV4Kys7CiAJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBZRm9jdXNhYmxlKSB7Ci0JCQkJCSgoWUZvY3VzYWJsZSkgZWxlbWVudCkuc2V0TGF5b3V0SWR4KGluZGV4KTsKLQkJCQkJKChZRm9jdXNhYmxlKSBlbGVtZW50KS5zZXRMYXlvdXRDb2x1bW5zKDEpOworCQkJCQlhcHBseU5leHRMYXlvdXRpbmdJbmRleCgoWUZvY3VzYWJsZSkgZWxlbWVudCk7CisJCQkJCS8vIFRPRE8gLSBmaXggbWUKKwkJCQkJLy8gKChZRm9jdXNhYmxlKSBlbGVtZW50KS5zZXRMYXlvdXRDb2x1bW5zKDEpOwogCQkJCX0nJycKIAkJfQogCQkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2NvcGluZy9TdHJhdGVneURTTFNjb3BlUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Njb3BpbmcvU3RyYXRlZ3lEU0xTY29wZVByb3ZpZGVyLnh0ZW5kCmluZGV4IDg3MjFhNjguLmU3MmI4ZmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2NvcGluZy9TdHJhdGVneURTTFNjb3BlUHJvdmlkZXIueHRlbmQKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9zY29waW5nL1N0cmF0ZWd5RFNMU2NvcGVQcm92aWRlci54dGVuZApAQCAtMyw5ICszLDExIEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgICAgICAgIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWxpZGF0aW9uL1N0cmF0ZWd5RFNMVmFsaWRhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWxpZGF0aW9uL1N0cmF0ZWd5RFNMVmFsaWRhdG9yLnh0ZW5kCmluZGV4IDhhZDUxYTMuLmM1MjQwYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdmFsaWRhdGlvbi9TdHJhdGVneURTTFZhbGlkYXRvci54dGVuZAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3ZhbGlkYXRpb24vU3RyYXRlZ3lEU0xWYWxpZGF0b3IueHRlbmQKQEAgLTMsOSArMywxMSBAQAogICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wICAgICAgICAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdmFsdWVjb252ZXJ0ZXIvU3RyYXRlZ3lRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvdmFsdWVjb252ZXJ0ZXIvU3RyYXRlZ3lRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YQppbmRleCBmZDA2ZTNiLi40YzkxZTc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3ZhbHVlY29udmVydGVyL1N0cmF0ZWd5UXVhbGlmaWVkTmFtZVByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWx1ZWNvbnZlcnRlci9TdHJhdGVneVF1YWxpZmllZE5hbWVQcm92aWRlci5qYXZhCkBAIC0zLDkgKzMsMTEgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAgICAgICAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2NvbnN0YW50cy9TdHJhdGVneUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9jb25zdGFudHMvU3RyYXRlZ3lDb25zdGFudHMuamF2YQppbmRleCA4ODQwYjhhLi5kNjcxNjhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2NvbnN0YW50cy9TdHJhdGVneUNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvY29uc3RhbnRzL1N0cmF0ZWd5Q29uc3RhbnRzLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZm9ybWF0dGluZy9TdHJhdGVneURTTEZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9mb3JtYXR0aW5nL1N0cmF0ZWd5RFNMRm9ybWF0dGVyLmphdmEKaW5kZXggMTU5ODhjMS4uYTVjZDUwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9mb3JtYXR0aW5nL1N0cmF0ZWd5RFNMRm9ybWF0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9mb3JtYXR0aW5nL1N0cmF0ZWd5RFNMRm9ybWF0dGVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZ2VuZXJhdG9yL1N0cmF0ZWd5RFNMR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2dlbmVyYXRvci9TdHJhdGVneURTTEdlbmVyYXRvci5qYXZhCmluZGV4IGI3NjAzMTQuLjMxMWM1M2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvZ2VuZXJhdG9yL1N0cmF0ZWd5RFNMR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9nZW5lcmF0b3IvU3RyYXRlZ3lEU0xHZW5lcmF0b3IuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEZvY3VzaW5nRW5oYW5jZXJDcmVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdFbmhhbmNlckNyZWF0b3IuamF2YQppbmRleCA0YzU4ZTNmLi42NTg1YzlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdFbmhhbmNlckNyZWF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdFbmhhbmNlckNyZWF0b3IuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEZvY3VzaW5nU3RyYXRlZ3lDcmVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdTdHJhdGVneUNyZWF0b3IuamF2YQppbmRleCBhZmE2MzhmLi40ZDBhMDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdTdHJhdGVneUNyZWF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMRm9jdXNpbmdTdHJhdGVneUNyZWF0b3IuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpAQCAtNDM0LDcgKzQzNiw3IEBACiAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gaWYgbm8gZWxlbWVudCB3YXMgZm91bmQgdG8gZm9jdXMgZ28gYmFjayB0byB0aGUgZmlyc3QgZWxlbWVudCIpOwogICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7Ci0gICAgICAgIF9idWlsZGVyLmFwcGVuZCgibmV4dEZvY3VzRWxlbWVudCA9IChZRW1iZWRkYWJsZSkgc2VydmljZS5nZXRNb2RlbEVsZW1lbnQoMSk7Iik7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgibmV4dEZvY3VzRWxlbWVudCA9IChZRW1iZWRkYWJsZSkgc2VydmljZS5nZXRNb2RlbEVsZW1lbnQoMCk7Iik7CiAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGJvb2xlYW4gX2VxdWFsc181ID0gZm9jdXNpbmdTdHJhdGVneS5nZXRGb2N1cygpLmdldExpdGVyYWwoKS5lcXVhbHMoRm9jdXNpbmdFbnVtLkJBQ0tXQVJELmdldExpdGVyYWwoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMSnZtTW9kZWxJbmZlcnJlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTEp2bU1vZGVsSW5mZXJyZXIuamF2YQppbmRleCA0ZGRjYWNjLi40MjQ4MGU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMSnZtTW9kZWxJbmZlcnJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xKdm1Nb2RlbEluZmVycmVyLmphdmEKQEAgLTIsOSArMiwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKICAqIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KKyAqCisgKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKICAqIAogICogIENvbnRyaWJ1dG9yczoKICAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xMYXlvdXRpbmdTdHJhdGVneUNyZWF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvanZtbW9kZWwvU3RyYXRlZ3lEU0xMYXlvdXRpbmdTdHJhdGVneUNyZWF0b3IuamF2YQppbmRleCA2MTc5OGM4Li5mZTViNjdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L2p2bW1vZGVsL1N0cmF0ZWd5RFNMTGF5b3V0aW5nU3RyYXRlZ3lDcmVhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9qdm1tb2RlbC9TdHJhdGVneURTTExheW91dGluZ1N0cmF0ZWd5Q3JlYXRvci5qYXZhCkBAIC0yLDkgKzIsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCiAgKiAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAgKiAKICAqICBDb250cmlidXRvcnM6CiAgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCkBAIC0yNjMsMTMgKzI2NSwxNCBAQAogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBZRm9jdXNhYmxlKSB7Iik7CiAgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIigoWUZvY3VzYWJsZSkgZWxlbWVudCkuc2V0TGF5b3V0SWR4KGluZGV4KTsiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoImFwcGx5TmV4dExheW91dGluZ0luZGV4KChZRm9jdXNhYmxlKSBlbGVtZW50KTsiKTsKICAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKChZRm9jdXNhYmxlKSBlbGVtZW50KS5zZXRMYXlvdXRDb2x1bW5zKCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChtb2RJZHgsICJcdCIpOwotICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiKTsiKTsKLSAgICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gVE9ETyAtIGZpeCBtZSIpOworICAgICAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyAoKFlGb2N1c2FibGUpIGVsZW1lbnQpLnNldExheW91dENvbHVtbnMoY2FsY3VsYXRlTWUoKSk7Iik7CisgICAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOwogICAgICAgICAgIF94aWZleHByZXNzaW9uXzEgPSBfYnVpbGRlcjsKICAgICAgICAgfQpAQCAtMjg4LDEwICsyOTEsMTMgQEAKICAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBZRm9jdXNhYmxlKSB7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0XHQiKTsKLSAgICAgIF9idWlsZGVyLmFwcGVuZCgiKChZRm9jdXNhYmxlKSBlbGVtZW50KS5zZXRMYXlvdXRJZHgoaW5kZXgpOyIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJhcHBseU5leHRMYXlvdXRpbmdJbmRleCgoWUZvY3VzYWJsZSkgZWxlbWVudCk7Iik7CiAgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CiAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0XHQiKTsKLSAgICAgIF9idWlsZGVyLmFwcGVuZCgiKChZRm9jdXNhYmxlKSBlbGVtZW50KS5zZXRMYXlvdXRDb2x1bW5zKDEpOyIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBUT0RPIC0gZml4IG1lIik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gKChZRm9jdXNhYmxlKSBlbGVtZW50KS5zZXRMYXlvdXRDb2x1bW5zKDEpOyIpOwogICAgICAgX2J1aWxkZXIubmV3TGluZSgpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOwogICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Njb3BpbmcvU3RyYXRlZ3lEU0xTY29wZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3Njb3BpbmcvU3RyYXRlZ3lEU0xTY29wZVByb3ZpZGVyLmphdmEKaW5kZXggYmUxZTM3Yy4uMzI1MzhiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS9zY29waW5nL1N0cmF0ZWd5RFNMU2NvcGVQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuc3RyYXRlZ3kveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvc3RyYXRlZ3kvc2NvcGluZy9TdHJhdGVneURTTFNjb3BlUHJvdmlkZXIuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5zdHJhdGVneS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9zdHJhdGVneS92YWxpZGF0aW9uL1N0cmF0ZWd5RFNMVmFsaWRhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3ZhbGlkYXRpb24vU3RyYXRlZ3lEU0xWYWxpZGF0b3IuamF2YQppbmRleCBiNzg1YTU2Li5lZDc1ZGE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3ZhbGlkYXRpb24vU3RyYXRlZ3lEU0xWYWxpZGF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LnN0cmF0ZWd5L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L3N0cmF0ZWd5L3ZhbGlkYXRpb24vU3RyYXRlZ3lEU0xWYWxpZGF0b3IuamF2YQpAQCAtMiw5ICsyLDExIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQogICogCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIAogICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAogICogCiAgKiAgQ29udHJpYnV0b3JzOgogICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggOTI5NGI3Yi4uMmMxMDkyYiAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0yLDkgKzIsMTEgQEAKIDwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiA8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KS4gLS0+CiA8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgotPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAgIC0tPgogPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Ci08IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCAgICAgICAgICAtLT4KIDwhLS0jIC0tPgogPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KIDwhLS0jIENocmlzdG9waGUgTG9ldHogIChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4K